क्या आपका मतलब है Delegate.Invoke
/ BeginInvoke
या Control.Invoke
/ BeginInvoke
?
Delegate.Invoke
: समान रूप से, समान धागे पर निष्पादित करें।
Delegate.BeginInvoke
: एक threadpool
धागे पर अतुल्यकालिक रूप से निष्पादित करें ।
Control.Invoke
: UI थ्रेड पर निष्पादित होता है, लेकिन कॉलिंग थ्रेड जारी रखने से पहले पूरा होने की प्रतीक्षा करता है।
Control.BeginInvoke
: UI थ्रेड पर निष्पादित होता है, और कॉलिंग थ्रेड पूरा होने की प्रतीक्षा नहीं करता है।
जब आप उपयोग करना चाह सकते हैं तो टिम के उत्तर का उल्लेख है BeginInvoke
- हालांकि यह ज्यादातर की ओर देखा गया था Delegate.BeginInvoke
, मुझे संदेह है।
Windows प्रपत्र एप्लिकेशन के लिए, मेरा सुझाव है कि आपको आमतौर पर उपयोग करना चाहिए BeginInvoke
। इस तरह से आपको गतिरोध के बारे में चिंता करने की ज़रूरत नहीं है, उदाहरण के लिए - लेकिन आपको यह समझने की ज़रूरत है कि यूआई आपके द्वारा इसे देखने के समय तक अपडेट नहीं किया गया है! विशेष रूप से, आपको डेटा को संशोधित नहीं करना चाहिए जो यूआई थ्रेड प्रदर्शन उद्देश्यों के लिए उपयोग करने वाला हो सकता है। उदाहरण के लिए, यदि आप एक है, तो Person
साथ FirstName
और LastName
गुण, और तुमने किया था:
person.FirstName = "Kevin"; // person is a shared reference
person.LastName = "Spacey";
control.BeginInvoke(UpdateName);
person.FirstName = "Keyser";
person.LastName = "Soze";
तब यूआई अच्छी तरह से "कीसर स्पेसी" प्रदर्शित कर सकता है। (वहाँ एक बाहर का मौका है यह "केविन सोज़" प्रदर्शित कर सकता है, लेकिन केवल मेमोरी मॉडल की अजीबता के माध्यम से।)
जब तक आपके पास इस प्रकार का मुद्दा है, हालांकि, Control.BeginInvoke
सही प्राप्त करना आसान है, और आपके पृष्ठभूमि धागे को बिना किसी अच्छे कारण के इंतजार करने से बचाएगा। ध्यान दें कि विंडोज फॉर्म टीम ने गारंटी दी है कि आप Control.BeginInvoke
"आग और भूल जाओ" तरीके से उपयोग कर सकते हैं - अर्थात बिना कॉल किए EndInvoke
। यह सामान्य रूप से async कॉल के बारे में सच नहीं है: आम तौर पर हर BeginXXX में एक समान EndXXX कॉल होना चाहिए, आमतौर पर कॉलबैक में।