public async Task<string> GetName(int id)
{
Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id));
return nameTask.Result;
}
在上面的方法返回语句中,我使用了 Task<T>.Result
属性(property)。
public async Task<string> GetName(int id)
{
Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id));
return await nameTask;
}
这里我用的是await Task<T>
.如果我认为 await 将释放调用线程但我不会错 Task<T>.Result
会阻止它,对吗?
最佳答案
I wont be wrong if I think that await will release the calling thread but Task.Result will block it, would it be right?
一般来说,是的。 await task;
将“让出”当前线程。 task.Result
将阻塞当前线程。 await
是异步等待; Result
是阻塞等待。
还有另一个更细微的区别:如果任务在故障状态下完成(即有异常),那么 await
将按原样(重新)引发该异常,但是 结果
会将异常包装在 AggregateException
中。
作为旁注,避免 Task.Factory.StartNew
。它几乎从来都不是正确的使用方法。如果您需要在后台线程上执行工作,请选择 Task.Run
。
Result
和 StartNew
都是合适的,如果你正在做 dynamic task parallelism ;否则,应避免使用它们。如果您正在做 asynchronous programming,两者都不合适.
关于c# - await Task<T> 和 Task<T>.Result 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27464287/