跨线程调用编译问题

时间:2010-07-29 16:28:57

标签: c# lambda invoke

有人可以建议为什么这行代码不能编译?它会生成CS1660:

s.run_button.Invoke((b) => { b.Enabled = false; },
 new object[] { s.run_button });

Visual Studio说:无法将lambda表达式转换为'System.Delegate'类型,因为它不是委托类型

2 个答案:

答案 0 :(得分:4)

Lambda表达式本身没有类型,不能转换为System.DelegateInvoke方法的类型为System.Delegate,因此它不会编译,因为lambda表达式没有类型。您需要在此处提供显式类型转换

s.run_button.Invoke(
  (Action<Button>)((b) => { b.Enabled = false; }), 
  new object[] { s.run_button });

答案 1 :(得分:2)

Invoke方法采用Delegate类型的参数。它是在lambdas进入我们的世界之前写的。最简单的解决方案是使用Action包装lambda。我不确定究竟是什么类型的“b”(C#编译器也没有,因此错误),所以你必须明确地传递它。类似的东西:

s.run_button.Invoke(new Action<Button>(b => b.Enabled = false), new object[] { s.run_button });