这两种使用等待形式之间是否有任何功能差异?
string x = await Task.Factory.StartNew(() => GetAnimal("feline"));
Task<string> myTask = new Task<string>(() => GetAnimal("feline"));
myTask.Start();
string z = await myTask;
具体来说,每个操作在1中调用的顺序是什么?是否已调用StartNew然后等待调用,或等待在1中首先调用?
答案 0 :(得分:28)
当您使用async
和await
编写代码时,应尽可能使用Task.Run
。
Task
构造函数(和Task.Start
)是来自任务并行库的保留,用于创建尚未启动的任务。不应在Task
代码中使用Task.Start
构造函数和async
。
同样,TaskFactory.StartNew
是一种较旧的方法,它不使用async
任务的最佳默认值,也不理解async
lambdas。它在某些情况下很有用,但绝大部分时间Task.Run
更适合async
代码。
答案 1 :(得分:15)
StartNew
只是short hand for creating and starting a task。如果要在启动它之前对Task
实例执行某些操作,请使用构造函数。如果您只想立即创建并启动任务,请使用简写。
StartNew
的文档说:
调用StartNew在功能上等同于创建任务 使用其中一个构造函数,然后调用Task.Start方法 安排任务执行。
答案 2 :(得分:-8)
没有区别。它们产生完全相同的IL代码。