27

这两种使用 await 的形式有什么功能上的区别吗?

  1. string x = await Task.Factory.StartNew(() => GetAnimal("feline"));
    
  2. Task<string> myTask = new Task<string>(() => GetAnimal("feline"));
    myTask.Start();
    string z = await myTask;
    

具体来说,1.中每个操作的调用顺序是什么?是先调用 StartNew,然后调用 await,还是先调用 1.?

4

2 回答 2

33

使用 and 编写代码时asyncawaitTask.Run尽可能使用。

构造Task函数(和Task.Start)是来自任务并行库的保留,用于创建尚未启动的任务。构造Task函数,Task.Start不应在async代码中使用。

同样,TaskFactory.StartNew是一种较旧的方法,它不使用async任务的最佳默认值并且不理解asynclambda。它在少数情况下很有用,但绝大多数情况下Task.Run更适合async编写代码。

于 2013-06-08T16:40:30.400 回答
18

StartNew只是创建和启动任务的简写。如果你想Task在启动之前对实例做一些事情,请使用构造函数。如果您只想立即创建和启动任务,请使用简写。

文档StartNew说:

调用 StartNew 在功能上等同于使用其构造函数之一创建任务,然后调用 Task.Start 方法来安排任务执行。

于 2013-06-08T16:21:43.197 回答