在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();
答案 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()