2012-03-06 30 views
7

Đây là câu hỏi chung về các mẫu không đồng bộ trong C# .NET được mô tả trên MSDN here.Trong C# .NET, thực hiện thao tác không đồng bộ có nhất thiết phải tạo một chuỗi chặn không?

Khi chạy dài hoạt động đồng bộ cần được gọi (ví dụ: WCF, truy vấn DB, IO, v.v.) và tôi không muốn chuỗi chặn (ví dụ - GUI), điều này có nghĩa là rằng phải tồn tại một sợi khác ở đâu đó mà ngăn chặn?

Có thực hiện một đồng bộ gọi không đồng bộ nhất thiết đòi hỏi một sợi nơi nào đó để ngăn chặn?

Vì vậy, nếu tôi thực hiện 10 cuộc gọi không đồng bộ dài (thực ra là 10 cuộc gọi đồng bộ), phải có 10 chủ đề ở đó đang chờ? Hoặc là có một cơ chế để ngăn chặn 10 chủ đề bị chặn?

Trong WCF, bạn có thể tạo các phương thức Bắt đầu và Kết thúc cho một cuộc gọi WCF để làm cho nó không đồng bộ. Điều này có nghĩa là khi tôi gọi phương thức không đồng bộ này, có một luồng ở đâu đó, trên máy khách hoặc máy chủ, điều đó có chờ tôi không?

Tôi đã đọc một số bài viết về các phương pháp khác nhau để đạt được sự không đồng bộ, nhưng những bài viết này không giải thích những gì được thực hiện dưới mui xe.

Cập nhật

tôi đã thực hiện câu hỏi của tôi specifc hơn, vì tôi thêm về quan tâm đến NET. các mẫu không đồng bộ được mô tả bởi MSDN.

Cập nhật 2

tôi cải câu hỏi để được thậm chí cụ thể hơn để thực hiện cuộc gọi đồng bộ không đồng bộ.

Trả lời

7

Trong khung .NET, có nhiều cách để thực hiện thao tác không đồng bộ: bằng cách sử dụng các phương thức luồng, thread, BeginXxx và EndXxx, APM dựa trên sự kiện hoặc APM dựa trên nhiệm vụ.

Mỗi mẫu không đồng bộ có triển khai nội bộ riêng và tất cả các Mô hình lập trình không đồng bộ này được giải thích tại blog này article, bao gồm mẫu không đồng bộ BeginXxx và EndXxx truyền thống.

Dưới đây là tóm tắt của tất cả các mẫu Async để tham khảo nhanh: Async Summary:

Hơn nữa, Jeffrey Richter cũng giải thích CLR Asynchronous Programming Model trong MSDN Magazine độc ​​đáo.

+0

lớn liên kết đến bài viết. Vì vậy, nó không rõ ràng nói như vậy, nhưng nó trông giống như cho các cuộc gọi async cấp thấp, điều này được thực hiện mà không cần chặn các chủ đề. Nhưng nếu bạn muốn thực hiện cuộc gọi đồng bộ không đồng bộ, thì phải tạo một chuỗi. Tôi có đúng không? – Mas

+0

@Mas Tạo một 'Chủ đề' chỉ là một cách để làm cho nó không đồng bộ. Như đã giải thích trong Tóm tắt trong câu trả lời, có nhiều cách khác để chuyển đổi các cuộc gọi đồng bộ sang các cuộc gọi không đồng bộ. – VS1

+0

Theo bảng, tất cả các Mẫu Async đều dựa trên các chủ đề (Nhiệm vụ cũng sử dụng các luồng trong nền). – Mas

2

Thật không may, không có câu trả lời duy nhất cho điều này. Một số thư viện cung cấp các hoạt động không đồng bộ nguyên bản được triển khai thực hiện, ví dụ như các ổ cắm, trong đó các thư viện được phần cứng hỗ trợ. Những người khác có thể không, giống như một thư viện của bên thứ ba có thể chặn rất tốt.

3

Không nhất thiết phải là một chuỗi cho mỗi thao tác. Như @Ioannis Karadimas, nói, điều này rất có thể phụ thuộc vào việc thực hiện.

Ví dụ: hãy tưởng tượng tôi muốn thực hiện async nhận từ 10 ổ cắm khác nhau. Điều này có thể được thực hiện với một chuỗi phụ duy nhất bằng cách sử dụng một cuộc gọi để chọn trong một vòng lặp, mà không quyết định chọn một socket có sẵn khi nhận được một tin nhắn.

2

'Vì vậy, nếu tôi thực hiện 10 cuộc gọi không đồng bộ dài, phải có 10 chủ đề ở đó đang chờ?' Nói chung, không.

'Hoặc có cơ chế ngăn chặn 10 chủ đề bị chặn không?' - có cơ chế cho phép 1 chuỗi chặn xử lý nhiều mục. Ví dụ đơn giản - một chuỗi hạt nhân có thể chờ trên một tín hiệu NIC và một hàng đợi đầu vào semaphore - nó thường bị chặn chờ đợi cho một hay khác. Ứng dụng người dùng không đồng bộ của bạn xếp hàng gửi mạng và chuỗi hạt nhân lấy nó từ hàng đợi và cố gắng gửi nó đến phần cứng thẻ mạng. Nếu không thể, nó sẽ thêm nó vào hàng đợi gửi nội bộ và trả về ứng dụng của bạn với câu trả lời 'WOULD_BLOCK'. Khi phần cứng đã sẵn sàng, nó báo hiệu luồng hạt nhân, sẽ xóa bỏ bộ đệm gửi của bạn và tải nó lên phần cứng.Tương tự như vậy, ứng dụng của bạn gửi trong một hoặc nhiều yêu cầu không đồng bộ, (với bộ đệm) và chuỗi hạt nhân thêm nó vào danh sách và trả về bằng câu trả lời 'WOULD_BLOCK'. Khi dữ liệu đi vào NIC, tín hiệu điều khiển của nó và chuỗi hạt nhân sẽ kiểm tra dữ liệu và cố gắng tìm một mục trong danh sách đang đợi dữ liệu đó. Nếu đó là dữ liệu cho ứng dụng của bạn, nó sao chép/DMA dữ liệu từ phần cứng vào bộ đệm của bạn và gọi lại cuộc gọi không đồng bộ của bạn, (lưu ý, cách gọi lại asycn chính xác của bạn được gọi và chủ đề phụ thuộc vào hệ điều hành). được xếp hàng đợi đến luồng GUI của bạn, hoặc một cấu trúc hoàn thành IOCP được xếp hàng đợi đến một nhóm luồng người dùng).

Dù sao, điểm là chuỗi hạt nhân có thể có nhiều mục nhập từ nhiều quy trình trong danh sách gửi nội bộ hoặc danh sách mục recv của nó. Bất cứ khi nào phần cứng, hoặc hàng đợi đầu vào của nó, đòi hỏi sự chú ý, nó chạy và xử lý nó, nếu không nó vẫn bị chặn.

1

Sẽ không có Đề xuất nào được gửi nếu bạn thực hiện cuộc gọi không đồng bộ bằng cách sử dụng thư viện Khung. cho ví dụ. Như trong trường hợp sử dụng của bạn, bạn đã đề cập đến "Trong WCF, bạn có thể tạo các phương thức Begin và End cho một cuộc gọi WCF để làm cho nó không đồng bộ. Điều này có nghĩa là khi tôi gọi phương thức không đồng bộ này, có một chuỗi ở đâu đó, trên máy khách hoặc máy chủ, điều đó có chờ tôi không? "

Có wont được bất kỳ chủ đề chờ đợi cho các hoạt động Async được hoàn thành, để biết thêm chi tiết bạn có thể kiểm tra blog tuyệt vời này http://blog.stephencleary.com/2013/11/there-is-no-thread.html

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