我应该使用 Task.Wait() 吗?
Posted
技术标签:
【中文标题】我应该使用 Task.Wait() 吗?【英文标题】:Should I use Task.Wait()? 【发布时间】:2018-10-11 15:34:19 【问题描述】:我应该在下面的代码中使用taskThatReturns.Wait()
还是可以省略它,因为根据我的理解taskThatReturns.Result
无论如何都会等待。
Task<string> taskThatReturns = new Task<string>(MethodThatReturns);
taskThatReturns.Start();
taskThatReturns.Wait();
Console.WriteLine(taskThatReturns.Result);
【问题讨论】:
你根本不应该使用Task.Start
。你应该使用var result=await Task.Run(MethodThatReturns);
。创建冷任务很少有任何正当理由
你为什么认为你应该打电话给Wait
?
我在训练中见过Wait
方法
KISS 是可取的:Console.WriteLine(MethodThatReturns());
【参考方案1】:
在访问Result
之前调用Wait()
是不必要的。
检查Task
和Task<TResult>
的参考代码表明void Wait()
方法和Result
属性的getter 最终都会进入执行实际等待的方法:
internal bool InternalWait(int millisecondsTimeout, CancellationToken cancellationToken)
两个代码路径都将相同的参数值发送到InternalWait
- 无限等待和默认取消令牌。
如果您在访问Result
之前调用Wait
,则会跳过getter 中通往InternalWait
的代码路径,因为已知该任务已完成。但是,两种情况下的最终结果将保持不变。
注意:此答案故意忽略优化代码片段的机会。
【讨论】:
【参考方案2】:async void DoTask()
string task = await returnString();
Console.WriteLine(task);
Task<string> returnString()
// you code here
您可以使用异步方法等待任务执行
【讨论】:
【参考方案3】:回答实际问题。您要么需要等待获得结果,要么需要按照 Panagiotis Kanavos 的建议进行操作,然后等待任务。您使线程过于复杂,这是所有不良示例的常见问题。
【讨论】:
【参考方案4】:如果你还想使用Task
,更好的办法是:
var result = taskThatReturns.GetAwaiter().GetResult();
【讨论】:
以上是关于我应该使用 Task.Wait() 吗?的主要内容,如果未能解决你的问题,请参考以下文章
是 .GetAwaiter().GetResult();一般使用安全吗?
为啥我的 C# 代码在回调到 C++ COM 时会停止,直到 Task.Wait/Thread.Join?
在 C# 中使用 Web 服务:删除 Task.Wait()