C# Control.Invoke 方法组

标签 c# multithreading delegates invoke

我正在使用线程在程序的 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/

相关文章:

c# - 来自后台 worker 冲突的查询?

c# - Json 无法解析 ajax post 请求

java - 了解 Java volatile 可见性

c++ - 如何将 boost 库链接到我的项目?

java - 用Java编写线程

ios - Swift:我的委托(delegate)协议(protocol)方法需要在另一个 View Controller 上执行

iphone - 处理应用程序委托(delegate)并在 View 之间切换

c# - 隐藏已编译应用程序的可执行代码的做法

c# - 在 C# 中提取 2 个图像之间的差异

c# - 在进行跨应用程序域开发时,如何以与代理相同的方式赋予委托(delegate)无限生命?