我应该使用 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
的代码路径,因为已知任务已完成.但是,两种情况下的最终结果将保持不变。
注意:此答案有意忽略了优化代码片段的机会。
我应该在下面的代码中使用 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
的代码路径,因为已知任务已完成.但是,两种情况下的最终结果将保持不变。
注意:此答案有意忽略了优化代码片段的机会。