2012-12-31 8 views
23

Khi nào tôi nên sử dụng tính năng không đồng bộ/đang chờ và khi nào tôi nên sử dụng song song.foreach trong C#? Là song song và không đồng bộ/chờ đợi phục vụ cùng một mục đích? Sự khác biệt trong chúng là gì?Không đồng bộ/chờ và song song trong C#

+0

Xem câu hỏi liên quan này: http://stackoverflow.com/questions/9898441/do-the-new-c-sharp-5-0-async-and-await-keywords-use -multiple-core –

+0

Xem cách gọi các hoạt động không đồng bộ trong https://stackoverflow.com/questions/11564506/nesting-await-in-parallel-foreach/11565531#11565531 song song –

Trả lời

72

async/chờ đợi là khoảng không đồng bộ của, trong khi Parallel.ForEach khoảng song song. Chúng là các khái niệm liên quan, nhưng không giống nhau.

Parallel.ForEach được sử dụng khi bạn muốn thực hiện cùng một thao tác trên tất cả các mục trong bộ sưu tập, song song, chặn luồng hiện tại cho đến khi tất cả các thao tác đã hoàn tất.

async/await được sử dụng khi thao tác hiện tại không thể thực hiện thêm tiến trình nào cho đến khi một thao tác không đồng bộ cụ thể hoàn tất, nhưng bạn không muốn chặn luồng hiện tại. Điều này đặc biệt hữu ích trong hai trường hợp:

  • Viết mã cơ bản về các hoạt động không đồng bộ khác nhau, cái khác, trên chuỗi giao diện người dùng, truy cập vào giao diện người dùng ngắn gọn giữa các thao tác. (Nó tổng quát hơn thế, nhưng đó là một ví dụ đơn giản.) Bạn không muốn chặn luồng giao diện người dùng, nhưng việc quản lý tất cả các hoạt động không đồng bộ đó là một cách khác.
  • Xử lý lô hàng hoạt động lâu dài tại một thời điểm - ví dụ: trong máy chủ web. Mỗi yêu cầu cá nhân có thể mất một thời gian dài do gọi vào dịch vụ web khác, cơ sở dữ liệu vv - nhưng bạn không muốn có một luồng cho mỗi yêu cầu, vì luồng là một tài nguyên tương đối tốn kém.

Bạn có thể kết hợp song song và không đồng bộ bằng cách khởi chạy tác vụ mới sẽ gọi Parallel.ForEach và chờ nhiệm vụ đó. (Chỉ như một ví dụ.)