从C#2.0中的另一个线程更新控件

时间:2011-06-19 03:47:25

标签: c# .net winforms multithreading parallel-processing

我在.NET 3.0中使用此代码

Action xx = () => button1.Text = "hello world";
this.Invoke(xx);

但是当我在.NET 2.0中尝试它时,我认为Action有这样的类型参数:

Action<T>

如何在.NET 2.0中实现第一个代码?

2 个答案:

答案 0 :(得分:6)

试试这个:

this.Invoke((MethodInvoker) delegate
{
    button1.Text = "hello world";
});

尽管在.NET 2.0中引入了Action,但您无法在.NET 2.0中使用lambda表达式() => ...语法。

顺便说一下,只要你不使用lambda sytax,你仍然可以在.NET 2.0中使用Action

Action action = delegate { button1.Text = "hello world"; };
Invoke(action);

答案 1 :(得分:1)

Action<T>是签名,这意味着操作所代表的方法必须采用单个参数。参数的类型取决于Invoke调用的签名。

有关如何表示Action的各种签名的一些代码示例:

var noArgs = () => button1.Text = "hello world"; // Action
var oneArg = (arg) => button1.Text = "hello world"; // Action<T>
var twoArgs = (arg1, arg2) => button1.Text = "hello world"; // Action<T,T>

如果您不需要使用方法的参数,那很好。但是你仍然需要在lambda表达式中声明它们。

现在,这并没有回答如何从.NET 2.0中做到这一点,但我认为(如果我错了,可能是错误的,纠正我)你不知道lambdas如何与Action类型对应。