等待任务和任务有什么区别.结果
本文关键字:任务 区别 结果 什么 等待 | 更新日期: 2023-09-27 18:34:12
public async Task<string> GetName(int id)
{
Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id));
return nameTask.Result;
}
在上面的方法 return 语句中,我使用的是 Task<T>.Result
属性。
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
会阻止它,那我不会错,对吗?
如果我认为 await 会释放调用线程但 Task.Result 会阻止它,我不会错,对吗?
一般来说,是的。 await task;
将"产生"当前线程。 task.Result
将阻止当前线程。 await
是异步等待; Result
是一个阻塞等待。
还有另一个更小的区别:如果任务以错误状态(即异常)完成,则await
将按原样(重新)引发该异常,但Result
会将异常包装在AggregateException
中。
作为旁注,请避免Task.Factory.StartNew
。它几乎从来都不是正确的使用方法。如果需要在后台线程上执行工作,首选 Task.Run
。
如果要执行动态任务并行性,则 Result
和StartNew
都是合适的;否则,应避免使用它们。如果您正在执行异步编程,则两者都不合适。
如果我认为 await 会释放调用线程但 Task.Result 会阻止它,我不会错,对吗?
你是对的,只要任务没有同步完成。如果是这样,使用 Task.Result
或 await task
将同步执行,因为await
将首先检查任务是否已完成。否则,如果任务尚未完成,它将阻塞调用线程Task.Result
,而使用 await
将同步等待任务完成。另一个不同的是异常处理。前者将传播AggregationException
(可能包含一个或多个异常),而后者将解开包装并返回基础异常。
作为旁注,通过同步方法使用异步包装器是一种不好的做法,应避免使用。此外,在异步方法中使用 Task.Result
是导致死锁的原因,也应避免。