理解异步编程中的 Task<T>.Result
和 await Task<T>
在异步编程中,await Task<T>
和 Task<T>.Result
之间的选择会显着影响性能和异常处理。 让我们来看看主要的区别。
GetName
方法说明了两种方法:
使用Task<T>.Result
:
<code class="language-csharp">public async Task<string> GetName(int id) { Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id)); return nameTask.Result; }</code>
nameTask.Result
阻塞当前线程,直到任务完成。这对于长时间运行的操作来说效率低下,可能会导致应用程序冻结。
使用await Task<T>
:
<code class="language-csharp">public async Task<string> GetName(int id) { Task<string> nameTask = Task.Factory.StartNew(() => string.Format("Name matching id {0} = Developer", id)); return await nameTask; }</code>
await nameTask
释放调用线程,允许其他任务并发执行。 该方法仅在 nameTask
完成时恢复。
关键区别:
Task<T>.Result
阻塞; await Task<T>
没有。await Task<T>
直接传播异常; Task<T>.Result
将它们包裹在 AggregateException
中。最佳实践:
Task.Factory.StartNew
;使用 Task.Run
来提高效率并更好地与 .NET 线程池集成。Task<T>.Result
和 Task.Factory.StartNew
可用于动态任务并行性,但在异步编程上下文中通常不鼓励使用它们,而是使用 await
以获得更好的响应能力和可维护性。 使用 await
是异步操作的首选且更健壮的方法。以上是`Task.Result` 与 `await Task`:什么时候应该使用哪个?的详细内容。更多信息请关注PHP中文网其他相关文章!