我应该使用 Task.Wait() 吗?

Should I use Task.Wait()?

我应该在下面的代码中使用 taskThatReturns.Wait() 还是我可以省略它,因为根据我的理解 taskThatReturns.Result 无论如何都会等待。

Task<string> taskThatReturns = new Task<string>(MethodThatReturns);
taskThatReturns.Start();
taskThatReturns.Wait();
Console.WriteLine(taskThatReturns.Result);
async void DoTask() {
  string task = await returnString();
  Console.WriteLine(task);
}

Task<string> returnString() {
  // you code here
}

您可以使用异步方法等待任务执行

回答实际问题。您要么需要等待获得结果,要么需要按照 Panagiotis Kanavos 的建议去做,等待任务。您使线程过于复杂,这是所有不良示例的常见问题。

如果您仍想使用 Task 更好的方法是:

var result = taskThatReturns.GetAwaiter().GetResult();

在访问Result之前调用Wait()是不必要的。

检查Task and Task<TResult>的参考代码表明void Wait()方法和Result属性的getter最终都进入了实际等待的方法:

internal bool InternalWait(int millisecondsTimeout, CancellationToken cancellationToken)

两个代码路径将相同的参数值发送到 InternalWait - 无限等待和默认取消令牌。

如果您在访问 Result 之前调用 Wait,则将跳过 getter 内通向 InternalWait 的代码路径,因为已知任务已完成.但是,两种情况下的最终结果将保持不变。

注意:此答案有意忽略了优化代码片段的机会。