Task.GetAwaiter().GetResult()
được ưa thích hơn Task.Wait
và Task.Result
bởi vì nó truyền bá các ngoại lệ thay vì gói chúng trong một AggregateException
. Tuy nhiên, cả ba phương pháp này đều gây ra khả năng gây ra sự cố chết đói và luồng xử lý. Tất cả chúng nên được tránh để ủng hộasync/await
.
Câu trích dẫn dưới đây giải thích tại sao Task.Wait
và Task.Result
không chỉ đơn giản chứa hành vi lan truyền ngoại lệ của Task.GetAwaiter().GetResult()
(do "thanh tương thích rất cao").
Như tôi đã đề cập trước đây, chúng tôi có một thanh tương thích rất cao và do đó chúng tôi đã tránh phá vỡ các thay đổi. Như vậy,Task.Wait
giữ lại hành vi ban đầu của nó luôn luôn gói. Tuy nhiên, bạn có thể thấy mình trong một số tình huống nâng cao khi bạn muốn hành vi tương tự như chặn đồng bộ được sử dụng bởi Task.Wait
, nhưng ở đó bạn muốn ngoại lệ ban đầu được truyền bá không được bao bọc thay vì được đặt trong một AggregateException
. Để đạt được điều đó, bạn có thể nhắm mục tiêu trực tiếp đến người phục vụ của Nhiệm vụ. Khi bạn viết NỀN await task;
, trình biên dịch sẽ dịch nó thành cách sử dụng Task.GetAwaiter()
phương thức, nó trả về một thể hiện có GetResult()
phương thức. Khi được sử dụng trên một Nhiệm vụ bị lỗi, GetResult()
sẽ truyền bá ngoại lệ ban đầu (đây là cách mà Nghi phạmawait task;
Martin Tấn có hành vi của nó). Do đó, bạn có thể sử dụngtask.GetAwaiter().GetResult()
Nếu bạn muốn trực tiếp gọi logic truyền bá này.
https://bloss.msdn.microsoft.com/pfxteam/2011/09/11/task-exception-handling-in-net-4-5/
“ GetResult
” Thực sự có nghĩa là “kiểm tra các nhiệm vụ cho các lỗi”
Nói chung, tôi cố gắng hết sức để tránh chặn đồng bộ trên một tác vụ không đồng bộ. Tuy nhiên, có một số tình huống tôi vi phạm nguyên tắc đó. Trong những điều kiện hiếm hoi đó, phương pháp ưa thích của tôi là GetAwaiter().GetResult()
vì nó bảo tồn các ngoại lệ của nhiệm vụ thay vì gói chúng trong mộtAggregateException
.
http://blog.stephencleary.com/2014/12/a-tour-of-task-part-6-results.html
GetResult
: "Loại này và các thành viên của nó được dự định sử dụng bởi trình biên dịch." Người khác không nên sử dụng nó.