2011-11-04 30 views
10

Tôi đã sử dụng Rx một thời gian cho các sự kiện trong các dự án của tôi và dành riêng cho lập trình Socket và phần tốt là làm tốt. Quản lý mã của tôi, lợi thế hiệu suất và tốt hơn nhiều để thực thi và diễn giải. Gần đây tôi phải sửa đổi quy trình dự án của tôi, nơi tôi cần phải đổ tất cả dữ liệu đến (từ hoạt động ổ cắm) vào hàng đợi (sử dụng triển khai MSMQ theo quyết định xếp hàng).Sử dụng phần mở rộng Phản hồi (Rx) cho tin nhắn MSMQ nhận được bằng cách sử dụng mẫu không đồng bộ (queue.BeginReceive, queue.EndReceive)

Vì MSMQ cung cấp cuộc gọi không đồng bộ cho các thông báo dequeing từ hàng đợi (nhưng trong một mẫu hình kinh khủng). Tôi đã đấu tranh để sử dụng Rx cho mục đích này ngay bây giờ, nhưng cho phép làm như vậy.

Câu hỏi: Một số người có thể cung cấp cho tôi một ví dụ mã rõ ràng để triển khai Rx cho nhận thư từ hàng đợi bằng mẫu Async.

tôi cần thực hiện hành async cho MSMQ tương tự như một cái gì đó như thế này

var data = Observable.FromAsyncPattern<byte[]>(
         this.receiverSocket.BeginReceive, 
         this.receiverSocket.EndReceive(some parameters); 

Cảm ơn trước. * cổ vũ * để Rx và .NET

+0

Bạn có thể chỉ cho tôi đến lớp mà có 'EndReceive' với các thông số? Tôi không thể tìm thấy nó ... – Enigmativity

+0

tôi không chắc chắn những gì bạn đang yêu cầu nhưng tôi đang trả lời những gì tôi hiểu. Tôi cần một thực hiện Rx (FromAsyncPattern) cho BeginReceive & EndReceive mà trả về cho tôi "System.Messaging.Message" đối tượng. Các phương thức async là cho các phương thức đối tượng System.Messaging.MessageQueue. Hy vọng bạn hiện đang có ý tưởng tốt hơn. Tôi hạnh phúc và chắc chắn rằng bạn sẽ trả lời siêu nhanh khi nói đến câu hỏi Rx: D – Jsinh

+0

Không có phương thức 'EndReceive' nào trong lớp' MessageQueue' có bất kỳ tham số nào ngoài 'IAsyncResult'. Loại 'receiverSocket' của bạn là gì? – Enigmativity

Trả lời

4

Nó sẽ là đơn giản như:

var queue = new System.Messaging.MessageQueue("test"); 
var fun = Observable.FromAsyncPattern((cb, obj) => queue.BeginReceive(TimeSpan.FromMinutes(10),obj,cb), a => queue.EndReceive(a)); 
var obs = fun(); 
+0

Tôi nghĩ bạn nói đúng. Toàn bộ "tham số trên EndReceive" hoàn toàn ném tôi! – Enigmativity

+1

có. Mã này hoạt động hoàn hảo. Nhưng vấn đề là với thời gian chờ. Khi thời gian: trường hợp ở đây là 10 phút là hơn và không có tin nhắn trong hàng đợi sau đó nó ném một MessageQueueException. Vấn đề thứ hai là var obs = fun(); đăng ký sẽ gọi chức năng chỉ một lần như thế nào tôi có thể làm cho nó đệ quy trong đồng bộ hóa với endreceive của yêu cầu trước đó. – Jsinh

+1

Lưu ý với nhân viên Google - mặc dù câu trả lời hay vào thời điểm đó, 'FromAsyncPattern' hiện đã ** lỗi thời **. – MickyD

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