我应该使用 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()是不必要的。

检查TaskTask&lt;TResult&gt; 的参考代码表明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()

Task.Wait 总是返回 false 虽然任务完成

如何在 .NET 中取消 Task.Wait() 之后正在运行的 OpenAsync()?

又一次Task.Wait引起的教训