beginInvoke, GUI and thread
I have application with two thread. One of them (T1) is main GUI form, another (T2) is func开发者_运维知识库tion working in loop. When T2 gets some information must call function with GUI form. I'm not sure that I do it right.
T2 call function FUNCTION, which update something in GUI form.
public void f() {
// controler.doSomething();
}
public void FUNCTION() {
MethodInvoker method = delegate {
f();
};
if ( InvokeRequired ) {
BeginInvoke( method );
} else {
f();
}
}
But now I must declare two function. How does it using only one function? Or how does it right.
You can do this in a single method by calling invoking yourself:
public void Function()
{
if (this.InvokeRequired)
{
this.BeginInvoke(new Action(this.Function));
return;
}
// controller.DoSomething();
}
Edit in response to comments:
If you need to pass additional arguments, you can do it by using a lambda expression as follows:
public void Function2(int someValue)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new Action(() => this.Function2(someValue)));
return;
}
// controller.DoSomething(someValue);
}
Looks good to me. You may be able to change the anonymous delegate to a lambda, which is a little cleaner. To get rid of the f() method declaration, you can inline its code into the delegate, then either Invoke the delegate as a MethodInvoker or simply call it like you would any other method:
public void FUNCTION() {
MethodInvoker method = ()=> controller.doSomething();
if ( InvokeRequired ) {
BeginInvoke( method );
} else {
method();
}
}
精彩评论