2016-06-24 33 views
12

câu hỏi nhanh .."async công tác sau đó chờ đợi Task" vs "Task sau đó trở về nhiệm vụ"

Để có được một số cơ sở hiểu biết sâu sắc về Asynchronous Lập trình và await Tôi muốn biết sự khác biệt giữa những gì là hai đoạn mã khi nói đến đa luồng và trình tự thực hiện và thời gian:

này:

public Task CloseApp() 
{ 
     return Task.Run(
         ()=>{ 
           // save database 
           // turn off some lights 
           // shutdown application 
          }); 
} 

Versus này:

public async Task CloseApp() 
{ 
     await Task.Run(
         ()=>{ 
           // save database 
           // turn off some lights 
           // shutdown application 
          }); 
} 

nếu tôi gọi đó là trong thói quen này:

private async void closeButtonTask() 
{ 
    // Some Task 1 
    // .. 

    await CloseApp(); 

    // Some Task 2 
    // .. 
} 
+1

Chúng có sự khác biệt tinh tế về cách ngoại lệ được bao bọc – SLaks

+0

Có thể dupe http://stackoverflow.com/questions/21033150/any-difference-between-await-task-run-return-and-return-task-run – DavidG

Trả lời

11

Nó gần như giống nhau (về chủ đề, v.v.). Nhưng đối với một thứ hai (sử dụng await) nhiều hơn chi phí sẽ được tạo ra bởi trình biên dịch.

Phương thức được khai báo là async và sử dụng await được chuyển thành máy trạng thái bởi trình biên dịch. Vì vậy, khi bạn nhấn await, luồng điều khiển được trả về phương thức gọi và thực hiện phương thức async của bạn được tiếp tục sau await khi chờ đợi Task đã hoàn tất.

Vì không còn mã nào sau số await của bạn, bạn không cần sử dụng await. Chỉ cần trả lại Task là đủ.

+0

* "khi bạn nhấn chờ, luồng điều khiển sẽ được trả về phương thức gọi" * - Luồng điều khiển ** có thể ** được trả về phương thức gọi, đặc biệt nó sẽ không trở lại khi nhiệm vụ chờ đợi đã hoàn thành . – acelent

+0

@acelent thx để biết chi tiết, không bao giờ nghĩ về những gì sẽ xảy ra khi công việc đã kết thúc. Tôi không biết chi tiết chính xác về những gì trình biên dịch thực hiện theo từng dòng. –

4

Có rất ít sự khác biệt giữa hai cách tiếp cận. Về cơ bản, họ chia sẻ cùng một ngữ nghĩa. Tuy nhiên, phiên bản với async/await kết thúc tốt đẹp việc thực hiện nhiệm vụ bên trong trong một nhiệm vụ do trình biên dịch tạo ra bên ngoài. Phiên bản không đồng bộ không. Do đó, phiên bản không đồng bộ (rất nhẹ) hiệu quả hơn.

+0

* "- Phiên bản không đồng bộ là rất hiệu quả." * - Điều đó phụ thuộc, nếu phương pháp này được gọi rất thường xuyên, thì phiên bản async/await có thể tạo ra rác đáng chú ý: máy trạng thái và một nhiệm vụ khác. – acelent

+0

@acelent: tạo ra một số thế hệ 0 rác vẫn cảm thấy khá biên với tôi – Falanwe

+0

Ok, tôi chỉ muốn chỉ ra rằng không phải luôn luôn như vậy cho tất cả mọi người ([1] (https://msdn.microsoft.com/en-us /magazine/hh456402.aspx)), và bạn không thể dựa vào các nhiệm vụ hoặc tài liệu tham khảo cho các công việc để trở nên vô hạn ([2] (https://channel9.msdn.com/Events/Build/BUILD2011/TOOL-829T) , [tại 0:25:40] (https://channel9.msdn.com/Events/Build/BUILD2011/TOOL-829T#time=25m40s), [at 0:30:20] (https: // channel9. msdn.com/Events/Build/BUILD2011/TOOL-829T#time=30m20s)). – acelent

Các vấn đề liên quan