【问题标题】:Should I use Task.Wait()?我应该使用 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());

标签: task console-application wait c#-2.0


【解决方案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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-26
          • 2021-12-10
          • 2010-12-25
          • 2014-05-27
          • 2010-12-25
          • 2018-09-11
          • 2012-07-02
          • 2017-04-21
          相关资源
          最近更新 更多