2008-10-15 13 views
6

मैंने कुछ शोध किया है और मुझे वास्तव में सी # में कार्यकर्ता थ्रेड से फ़ॉर्म नियंत्रण अपडेट करने का पसंदीदा तरीका नहीं मिल सकता है। मैं BackgroundWorker घटक के बारे में जानता हूं, लेकिन BackgroundWorker घटक का उपयोग किये बिना इसे करने का सबसे अच्छा तरीका क्या है?कार्यकर्ता थ्रेड से फ़ॉर्म नियंत्रण अपडेट करने का सबसे अच्छा तरीका क्या है?

उत्तर

10

अंगूठे का एक सामान्य नियम है जो कहता है कि यूआई थ्रेड के अलावा किसी भी थ्रेड से UI को अपडेट न करें। BackgroundWorker की विशेषताओं का उपयोग करना एक अच्छा विचार है, लेकिन आप नहीं चाहते हैं और किसी भिन्न थ्रेड पर कुछ हो रहा है, आपको यूआई थ्रेड पर विधि निष्पादित करने के लिए प्रतिनिधि को मजबूर करने के लिए "Invoke" या BeginInvoke करना चाहिए।

संपादित करें: जॉन बी टिप्पणी में यह अच्छा मुद्दा बनाया:

ध्यान रखें कि आह्वान() तुल्यकालिक और BeginInvoke है() अतुल्यकालिक है। यदि आप Invoke() का उपयोग करते हैं, तो आप को सावधान रहना होगा कि डेडलॉक न हो। मैं BeginInvoke() की अनुशंसा करता हूं जब तक कि आपको वास्तव में को सिंक्रोनस होने की आवश्यकता न हो।

कुछ सरल उदाहरण कोड:

// Updates the textbox text. 
private void UpdateText(string text) 
{ 
    // Set the textbox text. 
    m_TextBox.Text = text; 
} 

public delegate void UpdateTextCallback(string text); 

// Then from your thread you can call this... 
m_TextBox.Invoke(new UpdateTextCallback(this.UpdateText), 
    new object[]{"Text generated on non-UI thread."}); 

कोड ऊपर यह here और एक लंबे समय तक और अधिक शामिल एक here के बारे में पूछे जाने वाले प्रश्न से है।

+0

m_TextBox.Invoke वास्तव में क्या करता है? क्या यह यूआई थ्रेड पर प्रतिनिधि को निष्पादित करने के लिए मजबूर करता है? – Yttrium

+4

बिल्कुल। ध्यान रखें कि Invoke() तुल्यकालिक है और BeginInvoke() असीमित है। यदि आप Invoke() का उपयोग करते हैं, तो आपको सावधान रहना होगा कि डेडलॉक न करें। मैं BeginInvoke() को तब तक अनुशंसा करता हूं जब तक आपको वास्तव में सिंक्रोनस होने के लिए कॉल की आवश्यकता न हो। –

+0

अच्छी कॉल, जॉन बी। मुझे इसका उल्लेख करना चाहिए था। मैं बिंदु को प्रतिबिंबित करने के लिए संपादित कर दूंगा। –

5

आप पृष्ठभूमिवर्कर का उपयोग करके ऐसा क्यों नहीं करना चाहते हैं? इसमें प्रोग्रेस चेंजेड नामक शानदार कॉलबैक इवेंट है जो यूआई थ्रेड को अद्यतनों के बारे में जानता है, जो प्रोजेस बार-टाइप अपडेट और इसी तरह के लिए सही है।

link to details

1

इस here और एक here से संबंधित एक चर्चा नहीं है।

अनिवार्य रूप से, आप इसे पूरा करने के लिए Invoke का उपयोग करते हैं।

शुभकामनाएँ!

1

मैं Invoke कॉल करते समय InvokeRequired (केवल VS2008) पर विचार करता हूं। कई बार आप एक अलग थ्रेड से UI को अपडेट नहीं करेंगे। यह प्रतिनिधि बनाने आदि के ऊपरी हिस्से को बचाता है

if (InvokeRequired) 
     { 
      //This.Invoke added to circumvent cross threading exceptions. 
      this.Invoke(new UpdateProgressBarHandler(UpdateProgressBar), new object[] { progressPercentage }); 
     } 
     else 
     { 
      UpdateProgressBar(progressPercentage); 
     } 
संबंधित मुद्दे

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