action:说明符任务C#

时间:2016-08-12 14:10:21

标签: c# multithreading task

当我使用 Tasks 时,我遇到了这种语法:

class Program
{
    static void TestMethod()
    {
        Console.WriteLine("Test");
    }

    static  void Main(string[] args)
    {
        Task t = Task.Run(action: TestMethod); // Why this action: specifier
        t.Wait();
        Console.ReadKey();
    }
}

如果我删除了action关键字,编译器会给出一条错误消息:

  

错误CS0121:以下方法之间的呼叫不明确或   属性:' System.Threading.Tasks.Task.Run(System.Action)'和   ' System.Threading.Tasks.Task.Run(System.Func)'

实际上,获取此类消息很奇怪,因为我们没有为我们传递的方法返回Type,因此应将其视为Action而不是Func<>

我知道还有很多其他方法可以解决这个错误,例如转换为Action或匿名方法。但是,我无法理解action:来自何处以及它的工作原理。

2 个答案:

答案 0 :(得分:4)

这称为命名参数。它是c#语言的一个特性,它允许通过指定名称来以任意顺序指定函数调用的参数。有关详细信息,请参阅[https://msdn.microsoft.com/en-us/library/dd264739.aspx]。在您的情况下,它会使Run的调用唯一,因为只有System.Threading.Tasks.Task.Run(System.Action)变体有一个名为 action 的参数。

答案 1 :(得分:0)

data是参数的名称。在这里,您基本上是在告诉编译器:这里有一些东西,现在我希望您将它放在名为'action'的参数中。由于在这种情况下,2个方法没有相同的参数名称,编译器能够理解您要调用哪个,因此没有它就会出现错误的原因。

附注:这也可以用于在调用函数时无序地给出参数,或者仅指定一些可选参数而忽略之前的其他参数。非常酷的功能。