मैं कभी-कभी (लोड में) का उपयोग करता हूं
this.BeginInvoke((MethodInvoker) delegate {
// some code
});
या
this.BeginInvoke((MethodInvoker) this.SomeMethod);
(यदि आप "इस" के अलावा किसी अन्य घटना पर घटना को संभाल रहे हैं, तो इसे अपने "" रूप में बदलें।)
यह विंडो-फॉर्म्स लूप पर इनवॉइस को आगे बढ़ाता है, इसलिए यह उस समय प्रोसेस हो जाता है जब फॉर्म मैसेज कतार को प्रोसेस कर रहा होता है।
[अनुरोध पर अद्यतन]
Control.Invoke / Control.BeginInvoke विधियों का उपयोग थ्रेडिंग के साथ उपयोग करने के लिए किया जाता है, और UI थ्रेड पर काम को आगे बढ़ाने के लिए एक तंत्र है। आम तौर पर इसका इस्तेमाल वर्कर थ्रेड्स आदि द्वारा किया जाता है। Control.Inoke एक सिंक्रोनस कॉल करता है, जहां-as Control.BeginInvoke एक एसिंक्रोनस कॉल करता है।
आम तौर पर, इनका उपयोग इस प्रकार किया जाएगा:
SomeCodeOrEventHandlerOnAWorkerThread()
{
// this code running on a worker thread...
string newText = ExpensiveMethod(); // perhaps a DB/web call
// now ask the UI thread to update itself
this.Invoke((MethodInvoker) delegate {
// this code runs on the UI thread!
this.Text = newText;
});
}
यह विंडोज़ संदेश कतार पर एक संदेश को धक्का देकर करता है; यूआई थ्रेड (कुछ बिंदु पर) संदेश को डी-क्यू करता है, प्रतिनिधि को संसाधित करता है, और कार्यकर्ता को संकेत देता है कि यह पूरा हो गया ... अब तक बहुत अच्छा; - पीपी
ठीक है; यदि हम UI. थ्रेड पर Control.Invoke / Control.BeginInvoke का उपयोग करते हैं तो क्या होगा? यह कॉपी करता है ... अगर आप कंट्रोल कहते हैं। इंवोक, यह जानने के लिए पर्याप्त समझदार है कि संदेश कतार पर ब्लॉक करने से तत्काल गतिरोध पैदा होगा - इसलिए यदि आप पहले से ही यूआई थ्रेड पर हैं तो यह बस तुरंत कोड चलाता है ... ताकि हमारी मदद नहीं करता है ...
लेकिन Control.BeginInvoke अलग तरीके से काम करता है: यह हमेशा कतार पर काम करता है, यहां तक कि यह हम पहले से ही यूआई थ्रेड पर हैं। यह वास्तव में "एक पल में" कहने का एक तरीका है, लेकिन टाइमर आदि की असुविधा के बिना (जो अभी भी वैसे ही काम करना होगा!)।