क्योंकि Invoke
/BeginInvoke
Delegate
(बजाय एक टाइप किया प्रतिनिधि से) स्वीकार करने पर आपको संकलक बनाने के लिए प्रतिनिधि किस प्रकार बताने के लिए की जरूरत है; MethodInvoker
(2.0) या Action
(3.5) आम विकल्प हैं (ध्यान दें कि उनके पास एक ही हस्ताक्षर है); जैसे इतना:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(चेतावनी:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
आप मानकों में पारित करने के लिए की जरूरत है, फिर "पर कब्जा कर लिया चर" जिस तरह से कर रहे हैं आप अगर कैप्चर का उपयोग कर async थोड़ा सावधान रहना चाहिए , लेकिन सिंक ठीक है - यानी ऊपर ठीक है)
एक अन्य विकल्प एक विस्तार विधि लिखने के लिए है:
public static void Invoke(this Control control, Action action)
{
control.Invoke((Delegate)action);
}
तो
:
this.Invoke(delegate { this.Text = "hi"; });
// or since we are using C# 3.0
this.Invoke(() => { this.Text = "hi"; });
आप निश्चित रूप से BeginInvoke
साथ भी ऐसा ही कर सकते हैं:
public static void BeginInvoke(this Control control, Action action)
{
control.BeginInvoke((Delegate)action);
}
आप सी # 3.0 उपयोग नहीं कर सकते हैं, तो आप एक नियमित रूप से उदाहरण विधि के साथ भी ऐसा ही कर सकता है , संभवतः Form
बेस-क्लास में।
स्रोत
2008-10-31 10:56:33
कैसे कर सकते हैं करने के लिए सही जवाब होना चाहिए मैं इस जवाब में अपने पहले समाधान के लिए पैरामीटर पास? मेरा मतलब यह समाधान था: control.Invoke ((MethodInvoker) प्रतिनिधि {this.Text = "हाय";}); – uzay95
ऐक्शन में स्पष्ट भूमिका निभाने के बिना एक्सटेंशन विधि क्यों लागू की जाती है? –
क्योंकि संकलक उपयोग से अनुमान लगा सकता है। – RoboJ1M