2013-07-19 11 views
5

Tôi có dịch vụ cửa sổ được viết bằng .NET 4, tạo nhiều luồng chứa chạy vô hạn trong khi chạy (vòng). Khi tôi ngừng dịch vụ, boolean đang chạy trở thành false và chúng ta thoát khỏi vòng lặp while và một khi mỗi luồng làm điều đó, dịch vụ cuối cùng sẽ dừng lại.Làm cách nào tôi có thể hủy cuộc gọi Nhận dịch vụ nhận tin nhắn Microsoft ServiceBus?

Trong khi đó, nó gọi oMessageReceiver.Receive (TimeSpan.FromSeconds (30)). vì vậy đôi khi khi tôi cố gắng ngừng dịch vụ, tôi phải đợi tới 30 giây để quá trình Receive() hết thời gian chờ.

Một tùy chọn sẽ là giảm thời gian chờ từ 30 giây xuống nhỏ hơn. Tôi không chắc chắn về những hình phạt về hiệu suất mà nó sẽ phải gánh chịu, nhưng vì quá trình này không thực hiện bất kỳ công việc nào mà không có BrokeredMessage, tôi thực sự muốn giữ người nghe mở càng lâu càng tốt.

Tôi thấy rằng có phương thức .BeginReceive() trên Trình nhận thư. Tôi có một cảm giác sẽ có một mô hình lập trình tôi có thể sử dụng ở đây mà sẽ ngăn chặn dịch vụ của tôi treo trong khi tôi đã chờ đợi để nhận được thời gian chờ. Bất cứ ai có thể mô tả cách sử dụng các chức năng APM Bắt đầu/Kết thúc trong một Dịch vụ Windows vô hạn không?

Trả lời

2

Đóng MessageFactory mà Trình tạo MessageReceiver được tạo ra để hủy hoạt động nhận. Tôi đã có cùng một vấn đề khi gọi Abort hoặc Close trên MessageReceiver trước khi đóng nhà máy tin nhắn.

Sử dụng Bắt đầu/Kết thúc không đồng bộ sẽ không có sự khác biệt. Là một lưu ý phụ nếu bạn muốn chạy không đồng bộ xem xét việc tạo Trình bao bọc tác vụ bằng cách sử dụng TaskFactory.FromAsync để tận dụng lợi thế của các tính năng chờ đợi không đồng bộ mới.

Cũng xem câu trả lời của tôi về vấn đề này liên quan đến cùng một vấn đề:

Cancel an Azure Service Bus QueueClient long running Receive?

4

Trong 2.1 Windows Azure SDK mới, họ đã thay đổi mẫu Vai trò công nhân của nhân viên dịch vụ để sử dụng OnMessage mà gần đây đã được giới thiệu trong SDK 2.0. Bạn có thể nhìn vào mẫu đó để xem mã nó sử dụng để bắt đầu. Trong phương pháp này bạn thiết lập một hành động để thực hiện khi một tin nhắn đến. Trong thực tế, bạn cũng có thể thiết lập một tài sản MaxConcurrentCalls trên OnMessageOptions khi thiết lập nó sẽ xử lý các chủ đề bổ sung của bạn cho bạn. Nếu bạn sử dụng phương pháp OnMessage, bạn sẽ làm một cái gì đó tương tự, nơi dịch vụ sẽ đóng cửa QueueClient để nó không xử lý nữa. Bạn cũng có thể theo dõi với chỉ báo được đồng bộ hóa nếu một thông báo trên BẤT CỨ chủ đề đang xử lý và chỉ chờ xử lý xong.

Cách tốt nhất để sử dụng các phương pháp không đồng bộ (Bắt đầu/Kết thúc) kiểm tra "Best Practices for Leveraging Windows Azure Service Bus Brokered Messaging" có một vài ví dụ.