我应该在下面的代码中使用taskThatReturns.Wait()
还是可以省略它,因为根据我的理解taskThatReturns.Result
仍然会等待。
Task<string> taskThatReturns = new Task<string>(MethodThatReturns);
taskThatReturns.Start();
taskThatReturns.Wait();
Console.WriteLine(taskThatReturns.Result);
答案 0 :(得分:2)
在访问Wait()
之前无需调用Result
。
对Task
和Task<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();