Bạn không thể trả lại nhiệm vụ nếu phương pháp tự nó được tuyên bố là async
- vì vậy đây sẽ không làm việc, ví dụ :
async Task BarAsync()
{
return BazAsync(); // Invalid!
}
Điều đó sẽ yêu cầu loại trả lại là Task<Task>
.
Nếu phương pháp của bạn là chỉ làm một số lượng nhỏ của công việc và sau đó gọi chỉ một phương pháp async, sau đó lựa chọn đầu tiên của bạn là tốt, và có nghĩa là có một nhiệm vụ ít có liên quan. Bạn nên lưu ý rằng bất kỳ ngoại lệ nào được ném trong phương thức đồng bộ của bạn sẽ được gửi đồng bộ mặc dù - thực sự, đây là cách tôi muốn xử lý xác thực đối số.
Đó cũng là một mô hình phổ biến để triển khai quá tải, ví dụ: bằng mã thông báo hủy.
Chỉ cần lưu ý rằng nếu bạn cần thay đổi để chờ đợi một thứ khác, bạn sẽ cần phải biến nó thành một phương thức async thay thế. Ví dụ:
// Version 1:
Task BarAsync()
{
// No need to gronkle yet...
return BazAsync();
}
// Oops, for version 2 I need to do some more work...
async Task BarAsync()
{
int gronkle = await GronkleAsync();
// Do something with gronkle
// Now we have to await BazAsync as we're now in an async method
await BazAsync();
}
Nguồn
2013-07-26 17:03:57
Việc này có thể nguy hiểm nếu bạn kết hợp nó bằng 'using':' using (something) {return BazAsync(); } 'và' sử dụng (cái gì đó) {await BazAsync(); } 'hành xử rất khác nhau. – svick
Liên kết một câu hỏi tương tự: http://stackoverflow.com/q/21033150/1768303 – Noseratio
Tôi đã viết một bài đăng trên blog về [lợi thế và cạm bẫy của eliding 'async'/'await'] (http: //blog.stephencleary. com/2016/12/eliding-async-await.html). –