BecauseInvoke
/BeginInvoke
AcceptsDelegate
(Rather than a typed delegate), you need to tell the compiler what type of delegate to create;
MethodInvoker
(2.0) orAction
(3.5) are common choices (note they have the same signature); like so:
control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});
If you need to pass in parameters, then "captured variables" are the way:
string message = "Hi";control.Invoke((MethodInvoker) delegate {this.Text = message;});
(Caveat: You need to be a bit cautious if using capturesAsync,
SyncIs fine-I. e. the above is fine)
Another option is to write an extension method:
public static void Invoke(this Control control, Action action){ control.Invoke((Delegate)action);}
Then:
this.Invoke(delegate { this.Text = "hi"; });// or simce we are using C# 3.0this.Invoke(() => { this.Text = "hi"; });
You can of course do the sameBeginInvoke
:
public static void BeginInvoke(this Control control, Action action){ control.BeginInvoke((Delegate)action);}
If you can't use C #3.0, you cocould do the same with a regular instance method, presumably in
Form
Base-class.