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

时间:2018-10-11 15:34:20

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

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

Task<string> taskThatReturns = new Task<string>(MethodThatReturns);
taskThatReturns.Start();
taskThatReturns.Wait();
Console.WriteLine(taskThatReturns.Result);

4 个答案:

答案 0 :(得分:2)

在访问Wait()之前无需调用Result

TaskTask<TResult>的参考代码的检查表明,void Wait()方法和Result属性的获取器最终都进入了实际的等待时间:

internal bool InternalWait(int millisecondsTimeout, CancellationToken cancellationToken)

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

如果在访问Wait之前调用Result,由于已知该任务已完成,因此将跳过获取器内通往InternalWait的代码路径。但是,两种情况下的最终结果将保持不变。

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

答案 1 :(得分:0)

async void DoTask() {
  string task = await returnString();
  Console.WriteLine(task);
}

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

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

答案 2 :(得分:0)

回答实际问题。您要么需要等待以获得结果,要么需要按照Panagiotis Kanavos的建议进行操作,然后等待任务。您使线程过于复杂,这是所有不良示例都普遍存在的问题。

答案 3 :(得分:0)

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

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