2013-03-01 35 views
68

Trong .Net 4.5 Microsoft đã thêm tính năng Async/Await mới để đơn giản hóa mã hóa không đồng bộ. Tuy nhiên, tôi tự hỏiAsync/Await vs Threads

  1. Có thể Async/Await thay thế hoàn toàn cách cũ sử dụng Threads?
  2. Async/Await có khả năng làm bất cứ điều gì một Thread có thể làm không đồng bộ?
  3. Chỉ có thể sử dụng Async/Await với một số phương pháp như WebClient.DownloadStringAsync hoặc tôi có thể chuyển đổi bất kỳ phương thức đồng bộ nào để sử dụng phương thức đồng bộ Async/Await và không chặn luồng chính?
+2

Chủ đề và Async/Await là các tính năng không liên quan. Bạn có thể kết hợp chúng, nhưng bạn không phải. – dtb

+1

Tôi nghĩ rằng Async/Await đang làm điều tương tự mà 'new Thread (() => {Some Work}). Start();' đang làm?! phải không? –

+1

Không. Giả định của bạn là không chính xác. Bạn có thể nghĩ đến [Task.Run] (http://msdn.microsoft.com/en-us/library/hh195051.aspx) (TPL), thường được kết hợp với Async/Await, nhưng cũng không liên quan và không không phải được sử dụng với nó. – dtb

Trả lời

50

có thể thay thế hoàn toàn cách cũ bằng cách sử dụng Chủ đề không?

Không. Chủ đề có thể làm nhiều việc hữu ích hơn. Chờ đợi được thiết kế đặc biệt để xử lý nội dung nào đó dành thời gian, thường là yêu cầu I/O. Truyền thống được thực hiện với một cuộc gọi lại khi yêu cầu I/O hoàn tất. Viết mã dựa trên các callbacks này khá khó khăn, chờ đợi đơn giản hóa nó.

có khả năng làm những gì mà Chủ đề có thể thực hiện không đồng bộ?

Gần đúng. Chờ đợi chỉ cần chăm sóc đối phó với sự chậm trễ, nó không làm bất cứ điều gì khác mà một thread nào. Biểu tượng chờ đợi , có gì ở bên phải của từ khóa đang chờ đợi, là những gì được thực hiện công việc. Lý tưởng nhất là nó không sử dụng một sợi nào cả, nó sẽ gửi một yêu cầu trình điều khiển và sau khi trình điều khiển hoàn tất việc truyền dữ liệu, nó tạo ra một cuộc gọi lại thông báo hoàn thành. Mạng là sử dụng phổ biến nhất, độ trễ hàng trăm mili giây là phổ biến và tác dụng phụ không thể tránh khỏi của các dịch vụ di chuyển từ máy tính để bàn hoặc mạng LAN thành "đám mây". Sử dụng các dịch vụ như vậy một cách đồng bộ sẽ làm cho một giao diện người dùng khá không phản hồi.

chỉ có thể được sử dụng với một số phương pháp như WebClient.DownloadStringAsync

số Bạn có thể sử dụng nó với bất kỳ phương thức trả về một nhiệm vụ. Các phương thức XxxxAsync() chỉ là các phương thức đã có sẵn trong khung công tác .NET cho các hoạt động phổ biến cần có thời gian. Cũng giống như tải xuống dữ liệu từ máy chủ web.

+4

Trong khía cạnh C# hiện đại, cách tiếp cận tốt nhất để đạt được Async-Callbacks trên API bên ngoài là gì? – bonCodigo

+4

Được bao gồm trong đoạn cuối, sử dụng Tác vụ. –

+0

Tôi mong đợi một cái gì đó mà một thread có thể làm điều đó không thể được thực hiện thông qua lập trình async làm ví dụ. –

12

The official statement on this. Mặc dù bạn nên hiểu sự khác biệt giữa chủ đề và lập trình không đồng bộ trước khi thay thế một cách mù quáng một thứ với người khác.

+0

Điều này giống như tài nguyên đầu tiên tôi đã đọc về Chủ đề và Async/Await rõ ràng và súc tích. –

+0

Câu trả lời này chỉ chứa một liên kết đến tài liệu. Khi liên kết có thể bị lỗi thời, câu trả lời có thể bị lỗi thời - hoặc thậm chí tệ hơn - hoàn toàn vô dụng. Thay vào đó, chúng tôi khuyến khích người dùng Stack đăng các phần liên quan trực tiếp vào câu hỏi của họ. – HimBromBeere

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