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

本文关键字:方法 类的 Run Task | 更新日期: 2023-09-27 18:19:49

在C#中尝试Task,注意到我理解中的一个问题。我想用不同的方式创建一个Task。以下是创建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");    
}

我用Thread做了一些实验,它寻找Thread。下面的代码在VS2015中有效。

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

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

它没有编译的原因,并给出以下错误消息:

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()