将方法传递给Task类的Run方法

时间:2015-10-30 07:21:18

标签: c# multithreading

在C#中尝试使用Task,注意我的理解中的问题。我想以不同的方式创建一个任务。以下是创建任务的一些方法。

   //Probably standard way is like this.
   Task t0 = Task.Run(() => { Console.WriteLine("Hello 0"); });
   t0.Wait();

在C#中创建任务的其他方法可能有以下几种,有些几乎相似,人们不使用这些,我在这里仅提供参考。

   Task t_1 = Task.Run(delegate ()
   {
       Console.WriteLine("Calling with Delegate");
   });
   t_1.Wait();

  Task t1 = Task.Run(delegate () { Console.WriteLine("Hello 1"); });
  t1.Wait();

  Action a = MethodA;
  Task t2 = Task.Run(a);
  t2.Wait();

  Action a2 = new Action(MethodA);
  Task t22 = Task.Run(a2);
  t22.Wait();

我的问题是,我可以直接将方法传递给Task.Run(..),它返回void并且不接受任何参数(如MethodA)。至少在VS 2015中,以下代码无法编译,我理解的内容是什么?

Task t3 = Task.Run(MethodA);
t3.Wait();

public static void MethodA()
{
    Console.WriteLine("MethodA is being called");    
}

我做了一些线程实验,它查找线程以下代码在VS 2015中有效。

var thread5 = new Thread(MethodA);
thread5.Start();

1 个答案:

答案 0 :(得分:1)

它无法编译的原因,并提供此错误消息:

  

CS0407' void MethodA()'有错误的返回类型

是参数类型推断选择了错误的参数类型。

Task.Run方法有8个重载,包含各种Func<...>Action<...>个委托,以及其他各种参数,这里有趣的是:

Task.Run(Action action);
Task.Run(Func<Task> function);
Task.Run(Func<TResult> function);
Task.Run(Func<Task<TResult>> function);

基本上编译器无法选择正确的。

稍微帮助编译器会使代码编译,但如果你需要使用Action重载,那么你必须指定,这是一个编译的例子:

public static Task<int> MethodA()