0

我真的不明白调用。我知道它所做的是它告诉当前操作要在它需要运行的线程(UI 线程)上运行。但我不明白为什么你可以做这么多不同的版本。例如:

this.BeginInvoke(new MethodInvoker(delegate { currping.Text = Status; }));

this.BeginInvoke(new Action(() => {  currping.Text = Status; }));

我不明白是否有区别。从我能掌握的情况来看,他们都会做同样的事情。

我在这里错过了什么吗?

4

2 回答 2

3

Action在 .NET 3.5 框架中添加为不带参数也不返回任何内容的通用委托,而MethodInvoker自 1.1 以来就存在,因此您通常只会看到使用MethodInvoker. 这两种委托类型具有相同的签名。

BeginInvoke()实际上需要一个Delegate对象,因此任何不带参数的委托都可以与该重载一起使用。(需要参数的委托有一个(Delegate, object[])重载,尽管我倾向于使用无参数闭包。)

因为Delegate是通用类型,所以您必须以某种方式指定您提供的委托类型,因为编译器无法以其他方式推断它(见下文)。这比new Action替代方法短,但只有几个字符,而且实际上或多或少都不清楚:

this.BeginInvoke((Action)(() => { ... }));

您必须在此处指定委托类型,因为编译器不知道您想要哪种委托类型。例如:

Action foo = () => { };

这是可行的,因为编译器可以根据foo委托类型应该是的类型进行推断Action

// All of these examples cause CS1660.
Delegate foo1 = () => { };
object foo2 = () => { };
var foo3 = () => { };

这些是编译时错误,因为有许多委托类型与签名“不接受参数并返回void”相匹配,并且编译器不会假装知道您想要哪个。(在objectvar情况下,您可能还指的是一个Expression<>对象,它根本不是委托。但是,如果您使用delegate () {}而不是 lambda 表达式,您会得到相同的错误。)

于 2013-08-29T18:51:59.873 回答
1

new Something(这个部分和最里面的括号内的部分有两部分。

两者MethodInvokerAction都是Delegates,您需要将它们视为“功能模式”定义。这两个“模式”都代表的是“一个不接受任何参数并返回 void 的函数”

namespace System.Windows.Forms
{
    public delegate void MethodInvoker();
}

namespace System
{
    public delegate void Action()
}

因此它们都代表完全相同的“模式”,只是为了编码方便而在两个地方定义。例如,更明显的是,您计划使用委托来调用 Winforms 表单的方法 usingMethodInvoker比 using Action

第二部分是括号内的内容。这两个定义的含义相同,但是该模式() => { ... }Lambada 表达式,直到 Visual Studio 2008 或更高版本才添加。它们的意思都只是“我在这里内联定义一个函数”,这会创建所谓的匿名函数,因为它是一个没有名称的函数。你也可以传入一个函数名

public void Foo()
{
    this.BeginInvoke(new Action(Bar)); //BeginInvoke will call the function Bar()
}

private void Bar()
{
}
于 2013-08-29T19:02:14.340 回答