等待Task.Factory.StartNew(()=>与Task.Start; await Task;

时间:2013-06-08 16:17:29

标签: c# async-await c#-5.0

这两种使用等待形式之间是否有任何功能差异?

  1. string x = await Task.Factory.StartNew(() => GetAnimal("feline"));
    
  2. Task<string> myTask = new Task<string>(() => GetAnimal("feline"));
    myTask.Start();
    string z = await myTask;
    
  3. 具体来说,每个操作在1中调用的顺序是什么?是否已调用StartNew然后等待调用,或等待在1中首先调用?

3 个答案:

答案 0 :(得分:28)

当您使用asyncawait编写代码时,应尽可能使用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代码。