Task.GetAwaiter().GetResult()
与 Task.Result
:何时使用哪一个?
在代码中同步执行异步方法的需求很常见。这可以通过 Task
的 .GetAwaiter().GetResult()
或 .Result
属性来实现。然而,理解这两种方法的细微差别和潜在缺点至关重要。
Task.GetAwaiter().GetResult()
调用 Task
上的 .GetAwaiter().GetResult()
会直接检索其结果或抛出任何未观察到的异常。这种行为优于 .Wait()
和 .Result
,因为它确保了原始异常的传播,而不会将其封装在 AggregateException
中。
但是,需要注意的是,.GetAwaiter().GetResult()
与 .Wait()
和 .Result
一样,存在死锁和线程池资源耗尽的风险。
Task.Result
Task
的 .Result
属性也会检索其结果,如果任务被取消则会抛出 TaskCanceledException
。然而,异步操作中任何其他未观察到的异常将被捕获并包装在 AggregateException
中。
何时使用哪种方法
尽管 .GetAwaiter().GetResult()
具有异常传播的优势,但强烈建议尽可能避免异步任务的同步阻塞。这种方法可能导致死锁和资源耗尽。相反,考虑使用 async/await
机制编写完全异步的代码,以避免这些问题。
以上是`.getawaiter()。getResult()的详细内容。更多信息请关注PHP中文网其他相关文章!