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中文網其他相關文章!