मैंने कुछ शोध किया है और मुझे वास्तव में सी # में कार्यकर्ता थ्रेड से फ़ॉर्म नियंत्रण अपडेट करने का पसंदीदा तरीका नहीं मिल सकता है। मैं BackgroundWorker घटक के बारे में जानता हूं, लेकिन BackgroundWorker घटक का उपयोग किये बिना इसे करने का सबसे अच्छा तरीका क्या है?कार्यकर्ता थ्रेड से फ़ॉर्म नियंत्रण अपडेट करने का सबसे अच्छा तरीका क्या है?
उत्तर
अंगूठे का एक सामान्य नियम है जो कहता है कि यूआई थ्रेड के अलावा किसी भी थ्रेड से 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 के बारे में पूछे जाने वाले प्रश्न से है।
आप पृष्ठभूमिवर्कर का उपयोग करके ऐसा क्यों नहीं करना चाहते हैं? इसमें प्रोग्रेस चेंजेड नामक शानदार कॉलबैक इवेंट है जो यूआई थ्रेड को अद्यतनों के बारे में जानता है, जो प्रोजेस बार-टाइप अपडेट और इसी तरह के लिए सही है।
मैं 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);
}
- 1. किसी अन्य थ्रेड से अवलोकन करने योग्य चयन को अपडेट करने का सबसे अच्छा तरीका क्या है?
- 2. बैज को अपडेट करने का सबसे अच्छा तरीका UIView
- 3. रेल में कार्यकर्ता प्रक्रियाओं को व्यवस्थित करने का सबसे अच्छा तरीका क्या है?
- 4. अपडेट-समीक्षा-प्रकाशित वर्कफ़्लो प्रबंधित करने का सबसे अच्छा तरीका?
- 5. एंगुलरजेएस - $ रूट पैरामीटर अपडेट करने का सबसे अच्छा तरीका
- 6. एडाप्टर के अंतर्निहित डेटा को अपडेट करने का सबसे अच्छा तरीका क्या है?
- 7. वेब फ़ॉर्म पर आवश्यक फ़ील्ड को हाइलाइट करने का सबसे अच्छा तरीका क्या है?
- 8. मॉडल खोज फ़ॉर्म बनाने का सबसे अच्छा तरीका?
- 9. RedirectToAction का परीक्षण करने का सबसे अच्छा तरीका क्या है?
- 10. एफ # कोड दस्तावेज करने का सबसे अच्छा तरीका क्या है?
- 11. रुझान डेटा संग्रहीत करने का सबसे अच्छा तरीका क्या है?
- 12. रद्द करने योग्य कार्यकर्ता थ्रेड
- 13. हस्ताक्षर ऑनलाइन कैप्चर करने का सबसे अच्छा तरीका क्या है?
- 14. तालिका को समर्पित करने का सबसे अच्छा तरीका क्या है?
- 15. jQuery प्रदर्शन करने का सबसे अच्छा तरीका क्या है .change()
- 16. सूची कॉपी करने का सबसे अच्छा तरीका क्या है?
- 17. डेटाबेस कॉपी करने का सबसे अच्छा तरीका क्या है?
- 18. क्लोजर में जीयूआई करने का सबसे अच्छा तरीका क्या है?
- 19. बुनियादी संख्या पहचान करने का सबसे अच्छा तरीका क्या है?
- 20. एकाधिक सबव्यूज़ व्यवस्थित करने का सबसे अच्छा तरीका क्या है?
- 21. "टाइमर" को लागू करने का सबसे अच्छा तरीका क्या है?
- 22. सी # परियोजना आयोजित करने का सबसे अच्छा तरीका क्या है?
- 23. एनएसएमयूटेबलएरे को शफल करने का सबसे अच्छा तरीका क्या है?
- 24. एक बीन शुरू करने का सबसे अच्छा तरीका क्या है?
- 25. वसंत में इसे फिर से करने का सबसे अच्छा तरीका?
- 26. कस्टम नियंत्रण में जावास्क्रिप्ट को संभालने का सबसे अच्छा तरीका?
- 27. गणित अभिव्यक्ति निष्पादित करने का सबसे अच्छा तरीका क्या है?
- 28. तारों को पार्स करने का सबसे अच्छा तरीका क्या है?
- 29. सेलेनियम में पुनर्निर्देशन करने का सबसे अच्छा तरीका क्या है?
- 30. पायथन प्रिंट टॉगल करने का सबसे अच्छा तरीका क्या है?
m_TextBox.Invoke वास्तव में क्या करता है? क्या यह यूआई थ्रेड पर प्रतिनिधि को निष्पादित करने के लिए मजबूर करता है? – Yttrium
बिल्कुल। ध्यान रखें कि Invoke() तुल्यकालिक है और BeginInvoke() असीमित है। यदि आप Invoke() का उपयोग करते हैं, तो आपको सावधान रहना होगा कि डेडलॉक न करें। मैं BeginInvoke() को तब तक अनुशंसा करता हूं जब तक आपको वास्तव में सिंक्रोनस होने के लिए कॉल की आवश्यकता न हो। –
अच्छी कॉल, जॉन बी। मुझे इसका उल्लेख करना चाहिए था। मैं बिंदु को प्रतिबिंबित करने के लिए संपादित कर दूंगा। –