क्योंकि Invoke
/ (एक टाइप किए गए प्रतिनिधि के बजाय) BeginInvoke
स्वीकार करता है Delegate
, आपको कंपाइलर को यह बताना होगा कि किस प्रकार का प्रतिनिधि बनाना है; MethodInvoker
(2.0) या Action
(3.5) सामान्य विकल्प हैं (ध्यान दें कि उनके पास एक ही हस्ताक्षर है); इस तरह:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
यदि आपको मापदंडों में पारित करने की आवश्यकता है, तो "कैप्चर किए गए चर" इस प्रकार हैं:
string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});
(चेतावनी: अगर आपको एस्क्वायर का उपयोग करना है तो आपको थोड़ा सतर्क रहने की जरूरत है , लेकिन सिंक ठीक है - यानी ऊपर ठीक है)
एक अन्य विकल्प एक्सटेंशन विधि लिखना है:
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);
}
यदि आप C # 3.0 का उपयोग नहीं कर सकते हैं, तो आप एक नियमित उदाहरण विधि के साथ ऐसा कर सकते हैं, संभवतः Form
बेस-क्लास में।