我正在使用线程在程序的 UI 中运行长时间操作,这样它就不会锁定。但是,在这些任务中,我需要更新控件,如果不是从创建它们的线程中这是不可能的。建议使用control.BeginInvoke(Delegate)来执行你想要的方法。
但是,要做到这一点,您必须声明委托(delegate)类型,然后才能调用它们。
所以,它是这样的:如果我想执行方法 void Update(),我必须去:
delegate void CallbackVoid();
void Update() {...}
...(in task code)...
this.BeginInvoke(new CallbackVoid(Update));
对于每种方法来说,这都是相当烦人的。我不能以某种方式自然地做到这一点,例如:
void Update() {...}
this.BeginInvoke(Update);
最佳答案
简化事情的一个选项是添加扩展方法:
public static void BeginInvokeAction(this Control control, Action action)
{
control.BeginInvoke(action);
}
然后你可以使用:
this.BeginInvokeAction(action);
这样做的原因是我们现在为编译器提供了一个具体的委托(delegate)类型来将方法组转换为该类型。
关于C# Control.Invoke 方法组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15835016/