2009-04-23 10 views
26

सी # 2.0 और मेथडइवॉकर प्रतिनिधि का उपयोग करते हुए, मेरे पास एक GUI एप्लिकेशन है जो GUI थ्रेड या वर्कर थ्रेड से कुछ ईवेंट प्राप्त करता है।एक GUI ऐप के लिए C# MethodInvoker.Invoke() का उपयोग करना ... क्या यह अच्छा है?

मैं रूप में घटना से निपटने के लिए निम्नलिखित पैटर्न का उपयोग करें:

private void SomeEventHandler(object sender, EventArgs e) 
{ 
    MethodInvoker method = delegate 
     { 
      uiSomeTextBox.Text = "some text"; 
     }; 

    if (InvokeRequired) 
     BeginInvoke(method); 
    else 
     method.Invoke(); 
} 

इस पद्धति का उपयोग करके मैं वास्तविक यूआई कोड नकल नहीं है, लेकिन क्या मैं सुनिश्चित नहीं हूं के बारे में है, तो है इस विधि अच्छा है ।

विशेष रूप से, लाइन

method.Invoke() 

यह लागू है या यह जीयूआई धागे पर विधि के लिए एक सीधा कॉल करने के लिए कुछ हद तक का अनुवाद करता है के लिए एक और धागा इस्तेमाल करता है?

उत्तर

21

method.Invoke() कॉल वर्तमान निष्पादन धागे पर प्रतिनिधि को निष्पादित करता है। BeginInvoke(method) का उपयोग करना सुनिश्चित करता है कि प्रतिनिधि को जीयूआई थ्रेड पर बुलाया जाता है।

कोड डुप्लिकेशन से बचने का यह सही तरीका है जब एक ही विधि को GUI थ्रेड और अन्य थ्रेड से दोनों कहा जा सकता है।

+0

धन्यवाद! मैं विधि का उपयोग करने पर फंस गया था। इन्वोक और यहां तक ​​कि Invoke ((MethodInvoker)। BeginInvoke पर वापस जाकर चाल चल रही है। –

0

यह उसी धागे पर कॉल करता है। आप कोड के माध्यम से कदम से जांच सकते हैं। उस दृष्टिकोण के साथ कुछ भी गलत नहीं है।

2

WinForms के लिए, Control.Invoke(Delegate) पर कॉल करने से यूआई के थैड के संदेश पंप पर एक संदेश भेजा जाता है। धागा तब संदेश को संसाधित करता है और प्रतिनिधि को कॉल करता है। एक बार इसे संसाधित करने के बाद, Invoke अवरुद्ध हो जाता है और कॉलिंग थ्रेड आपके कोड को फिर से शुरू करता है।

5

ध्यान रखें कि अगर आप पृष्ठभूमि धागे और नियंत्रण पर हैं तो नियंत्रण। इन्वोकर आवश्यक वापसी झूठी है। IHandleCreated गलत है। मैं एक डीबग के साथ कोड की रक्षा करूंगा। एस्र्टर्ट जो अप्रबंधित हैंडल निर्माण के लिए जांच करता है।

14

व्यक्तिगत तौर पर मैं इस विधि की तरह:

private void ExecuteSecure(Action a) 
{ 
    if (InvokeRequired) 
     BeginInvoke(a); 
    else 
     a(); 
} 

और फिर आप लिख सकते हैं इस तरह एक-लाइनर्स:

ExecuteSecure(() => this.Enabled = true); 
+0

कुछ ठीक नहीं दिखता है। InvokeRequired नियंत्रण पर चल रहा है, आप इसे कुछ भी नहीं कर रहे हैं। इसका क्या अर्थ है? – Craig

+0

InvokeRequired इस जैसा ही है। InvokeRequired। –

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

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