2011-12-07 22 views
5

Tôi đang xem xét triển khai API nơi nhiều hoạt động có thể chạy đồng thời. Các tổ chức sự kiện dựa trên mẫu không đồng bộ đã được khuyến cáo của MS:Một số giải pháp thay thế cho Mẫu không đồng bộ dựa trên sự kiện là gì?

// Asynchronous methods. 
public void Method1Async(string param, object userState); 
public event Method1CompletedEventHandler Method1Completed; 

public void CancelAsync(object userState); 
public bool IsBusy { get; } 

Tuy nhiên điều này dường như một chút vụng về được - nó đòi hỏi khách hàng để lọc ra trả lời đó không có nghĩa là cho họ và ngắt kết nối xử lý sự kiện khi thực hiện xong, vv Những gì tôi nghĩ là một cái gì đó giống như:

AsyncOperation1(string parm, Action<T> callback) 

Mỗi khách hàng nhận được kết quả riêng của mình được gửi trực tiếp. Tôi gặp khó khăn trong việc tìm ra cách hỗ trợ hủy bỏ thanh lịch. Tôi đoán điều hiển nhiên là cho AsyncOperation1 trả lại một số loại mã thông báo có thể được chuyển vào một phương thức CancelAsync. Tôi muốn tìm hiểu thêm về các mẫu không đồng bộ khác đang được sử dụng phổ biến trong. Net hoặc bằng các ngôn ngữ khác có thể được dịch một cách thích hợp

Trả lời

4

Hãy xem Reactive Extensions, bạn có thể trả lại một Quan sát có thể được đăng ký bởi khách hàng.

Đăng ký trả về một đối tượng triển khai IDisposable là cơ chế hủy đăng ký, chỉ cần vứt bỏ đối tượng.

Ví dụ:

IObservable<T> o = Method1Async(params); 

var observer = o.Subscribe(r => {/*do stuff with the result*/}, 
          ex => {/* do stuff with the exception */); 

// decide to cancel 
observer.Dispose(); 

Bạn có thể cài đặt các bit Reactive Extensions sử dụng NuGet, chỉ cần "cài đặt gói rx-chính"

+0

Tôi nghĩ bạn một mô tả một cách để thích nghi và tồn tại tổ chức sự kiện có trụ sở API không đồng bộ đến một IObservable. Làm thế nào một trong những đi về việc thực hiện một API mới từ đầu? – Shane

+0

Không, bạn có thể sử dụng Rx để thực hiện các hoạt động async của riêng bạn và cung cấp các triển khai của IObservable cho khách hàng của bạn để họ đăng ký. Hãy xem http://msdn.microsoft.com/en-us/library/hh211669(v=VS.103).aspx để biết thông tin trên giao diện ISubject Matt

+0

Tuy nhiên, có rất nhiều, nhiều phương pháp hiện có để tạo sự kiện bạn có thể sử dụng để xây dựng các quan sát ở mức cao hơn việc triển khai các giao diện – Matt

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