কারণ 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);
}
আপনি যদি সি # 3.0 ব্যবহার করতে না পারেন, আপনি সম্ভবত Form
বেস-ক্লাসে নিয়মিত উদাহরণ পদ্ধতিতে একই কাজ করতে পারেন ।