将方法传递给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();
它没有编译的原因,并给出以下错误消息:
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()