2009-02-20 11 views
26

प्रोसेस करते समय विंडोज फॉर्म एप्लिकेशन पर लेबल अपडेट करने का सबसे अच्छा तरीका क्या है?विंडोज फॉर्म में प्रसंस्करण करते समय लेबल अपडेट करें

मेरे पास एक लूप है जो उपयोगकर्ता के सिस्टम पर फ़ाइलों को प्रसंस्करण करता है जब उपयोगकर्ता बटन पर क्लिक करता है।

foreach (System.IO.FileInfo f in dir.GetFiles("*.txt")) 
{ 
    // Do processing 
    // Show progress bar 
    // Update Label on Form, "f.Name is done processing, now processing..." 
} 

कुछ नमूना कोड क्या होगा?

यह वास्तव में क्या कहा जाता है? क्या यह थ्रेडिंग या प्रतिनिधि है?

उत्तर

48

आप लिए एक त्वरित सुधार होगा:

Label1.Text = f.Name + " is done processing, now processing..."; 
Label1.Refresh(); 

आप वास्तव में DoEvents से बचना चाहते हैं, अन्यथा आप समस्याओं होगा यदि आपके उपयोगकर्ता बार-बार अपने फार्म पर बटन दबाता है।

13

आप एक और धागा पर यह कर किया जाना चाहिए, और फिर उस धागे से अपने यूआई धागा अद्यतन करने। आप UI थ्रेड पर इस काम को निष्पादित करके आगे की प्रक्रिया को अवरुद्ध कर रहे हैं।

आप कदम यूआई धागा के लिए इस कोड है, तो आप हमेशा Application.DoEvents फोन नहीं कर सकते सकता है, लेकिन मैं दृढ़ता से आप पहली बार इन विकल्पों का पता लगाने का सुझाव :

+1

मैं इसके साथ सहमत हूं - खासकर पृष्ठभूमिवर्कर के लिए। मैं इसे अक्सर इस्तेमाल करता हूं।BackgroundWorkers इस सरल और आसान की तरह बहु थ्रेडिंग ऑपरेशन करते हैं! – Keithius

13

आपको अपना डेटा एक धागे से दूसरे में प्राप्त करने की आवश्यकता होगी। यह कुछ तरीकों से किया जा सकता है ...

सबसे पहले, आपका "पृष्ठभूमि" धागा किसी प्रकार का "CurrentStatus" स्ट्रिंग वैरिएबल अपडेट कर सकता है, जो इसके साथ बदलता है। फिर आप अपने फॉर्म पर एक टाइमर डाल सकते हैं जो तब CurrentStatus चर को पकड़ लेगा और उसके साथ लेबल अपडेट करेगा।

दूसरा, आप लेबल नियंत्रण की InvokeRequired संपत्ति का उपयोग करके एक प्रतिनिधि के साथ पृष्ठभूमि थ्रेड से यूआई थ्रेड पर ऑपरेशन का आह्वान कर सकते हैं। उदाहरण के लिए तो ...

private delegate void UpdateStatusDelegate(string status); 
private void UpdateStatus(string status) 
{ 
    if (this.label1.InvokeRequired) 
    { 
     this.Invoke(new UpdateStatusDelegate(this.UpdateStatus), new object[] { status }); 
     return; 
    } 

    this.label1.Text = status; 
} 

आप कॉल कर सकते हैं कि UpdateStatus() किसी भी धागा (यूआई या पृष्ठभूमि) से विधि, और इसका पता लगाया जाएगा या नहीं, यह मुख्य यूआई धागे पर आपरेशन को लागू करने की जरूरत है (और यदि हां, तो यह करता है)। फिर जब उपयोगकर्ता "GO" बटन आप बस StartProcessing फोन करता हूँ() पर क्लिक करता है

private void StartProcessing() 
    { 
     System.Threading.Thread procThread = new System.Threading.Thread(this.Process); 

     procThread.Start(); 
    } 

    private void Process() // This is the actual method of the thread 
    { 
     foreach (System.IO.FileInfo f in dir.GetFiles("*.txt")) 
     { 
      // Do processing 
      // Show progress bar 
      // Update Label on Form, "f.Name is done processing, now processing..." 
      UpdateStatus("Processing " + f.Name + "...");     
     } 
    } 

:

वास्तव में धागा सेट करने के लिए, तो आप ऐसा इस तरह कर सकते हैं।

+1

यह सही उत्तर होना चाहिए। –

संबंधित मुद्दे