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

5
我正在使用适用于.NET 3.0的此代码。
Action xx = () => button1.Text = "hello world";
this.Invoke(xx);

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

Action<T>

如何在.NET 2.0中实现第一段代码?
2个回答

6

试试这个:

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

虽然 Action 在 .NET 2.0 中被引入,但你不能在 .NET 2.0 中使用 lambda 表达式的语法 () => ...

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

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

这个可以工作...但是aligray的答案,为什么我会得到那个错误..无法将匿名方法转换为类型“System.Delegate”,因为它不是委托类型..我认为,还是一样的.. - Vincent Dagpin

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实现它,但我假设(也许是错误的,如果我错了请纠正我)您不知道lambda如何对应于Action类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接