在希望在Control.Invoke内匿名调用委托的语法方面有一些问题.

我们try 了许多不同的方法,但都没有成功.

例如:

myControl.Invoke(delegate() { MyMethod(this, new MyEventArgs(someParameter)); }); 

其中someParameter是此方法的局部参数

上述情况将导致编译器错误:

无法将匿名方法转换为"System"类型."委托",因为它不是委托类型

推荐答案

因为Invoke/BeginInvoke接受Delegate(而不是类型化委托),所以您需要告诉编译器要创建哪种类型的委托;MethodInvoker(2.0)或Action(3.5)是常见的 Select (请注意,它们具有相同的签名);如下所示:

control.Invoke((MethodInvoker) delegate {this.Text = "Hi";});

如果您需要传入参数,那么"捕获变量"是一种方法:

string message = "Hi";
control.Invoke((MethodInvoker) delegate {this.Text = message;});

(警告:如果使用captures async,你需要谨慎一点,但是sync是可以的——也就是说,上面的选项是可以的)

另一种 Select 是编写扩展方法:

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);
}

如果你不能使用C#3.0,你可以用一个普通的实例方法来做同样的事情,大概是在Form个基类中.

.net相关问答推荐

在计算Total毫秒时,.NET TimeSpan类中是否存在错误?

我的Azure应用服务从哪里获取应用设置?

C#:如何构造异步/等待代码,其中许多请求是针对相同的、返回缓慢的数据发出的,这可以满足所有请求

将字符串与容差进行比较

从 byte[] 创建 zip 文件

从 switch 块中跳出 foreach 循环

将 int 转换为 .NET 中的位数组

如何在 EF 代码优先中禁用链接表的级联删除?

ReaderWriterLock 与锁{}

.NET 如何判断路径是否是文件而不是目录?

变量MyException已声明但从未使用

react 式扩展使用的好例子

如何对 LINQ to XML 中的元素进行深层复制?

为什么会出现编译错误使用未分配的局部变量?

如何访问 Session 变量并在 javascript 中设置它们?

读取 XML(从字符串)并获取一些字段 - 读取 XML 时出现问题

如何在 C# 中处理 XML

是否可以判断对象是否已附加到实体框架中的数据上下文?

WPF 中的 Application.DoEvents() 在哪里?

多个列表与 IEnumerable.Intersect() 的交集