2009-09-17 23 views
6

Theo như tôi có thể thấy từ tài liệu, cách bạn phải kiểm tra xem có thư trong hàng đợi thư không sử dụng phương pháp Peek. Sau đó bạn dựa vào nó thất bại với một MessageQueueException để cho bạn biết rằng hàng đợi rỗng.Tôi có thể xem qua MSMQ trống mà không bị ngoại lệ không?

public bool IsQueueEmpty() 
    { 
     bool isQueueEmpty = false; 
     MessageQueue myQueue = new MessageQueue(".\\myQueue"); 

     try 
     { 
      myQueue.Peek(new TimeSpan(0)); 
      isQueueEmpty = false; 
     } 

     catch(MessageQueueException e) 
     { 
      if (e.MessageQueueErrorCode == 
       MessageQueueErrorCode.IOTimeout) 
      { 
       isQueueEmpty = true; 
      } 
     } 
     return isQueueEmpty; 
    } 

Tôi luôn được thông báo - và đã có kinh nghiệm - việc đó là tốn kém và không nên được sử dụng cho các hoạt động bình thường. Vì vậy, câu hỏi của tôi là:

  • Giả định của tôi dựa vào việc bắt MessageQueueException là một hoạt động tốn kém có đúng không?

  • Có cách nào để kiểm tra đồng bộ nếu có thư trong hàng đợi mà không phải dựa vào ngoại lệ không?

Tôi đang làm việc với không gian tên System.Messaging trong C#, nhưng nếu tôi cần phải không được quản lý để giải quyết vấn đề này có thể là một tùy chọn. Và lưu ý rằng tôi muốn có một giải pháp mà không cần sử dụng WCF với MSMQ.

Trả lời

1

Cập nhật: Tôi không cho rằng hiệu suất không quan trọng. Nhưng tôi nghĩ rằng quá trình liên lạc liên lạc là rất tốn kém so với ngoại lệ.

Trước khi update:

  • Tôi nghĩ rằng trong bối cảnh giao tiếp quá trình liên (đó là những gì msmq làm) chi phí hợp ngoại lệ là không quan trọng. Kiểm tra nếu bạn muốn chắc chắn.
  • Tôi không nghĩ vậy.
+0

Chúng tôi chuyển các thư thông qua một đường ống dịch vụ mà chúng tôi sử dụng hàng đợi giữa chúng. Chúng tôi muốn có thông lượng cao nhất có thể, do đó, nó không phải là không quan trọng, nhưng cho đến nay chúng tôi có hiệu suất đủ tốt. –

+0

Tôi sẽ đợi để xem tôi có nhận được bất kỳ nhận xét nào khác không, nhưng nếu tôi không chấp nhận câu trả lời của bạn: | –

-1

MSMQ không phải là giao tiếp liên hoàn toàn bộ. Interprocess truyền thông chủ yếu là trong máy duy nhất nhưng msmq có thể được sử dụng cho các máy tính khác nhau giao tiếp. Guarenteed giao hàng, với flipside có trong cùng một hệ điều hành.

-2

thế nào về mq.GetAllMessages cố gắng(). Chiều dài> 0

+4

Thật sao? Ngay cả khi hàng đợi của bạn có thể chứa 1000 hoặc 10.000 thư lớn? Điều đó giống như ăn toàn bộ siêu thị trống rỗng chỉ vì bạn muốn biết thời tiết họ có bất kỳ trái táo nào. –

11
  • Có bạn là chính xác trong giả định rằng trường hợp ngoại lệ là tốn kém. Trên thực tế nó là ném mà là tốn kém, không phải là đánh bắt. Nó là bình thường đối với một hàng đợi để được sản phẩm nào tại thời điểm và một nhà nước bình thường không nên dẫn đến một ngoại lệ bị ném.

  • Bằng cách sử dụng MessageQueue.GetMessageEnumerator2, chúng tôi có thể sử dụng điều tra viên để xác định xem hàng đợi có trống hay không mà không tải tất cả thư. Với cách tiếp cận này, chúng tôi sẽ không bao giờ tải nhiều hơn một tin nhắn.

Ví dụ:

private static bool IsQueueEmpty(MessageQueue queue) 
{ 
    using (var enumerator = queue.GetMessageEnumerator2()) 
    { 
     return !enumerator.MoveNext(); 
    } 
} 

hoặc để thực hiện Peek mà trả về null nếu hàng đợi thông điệp là rỗng (chưa được kiểm tra, nhưng nên làm việc)

private static Message Peek(MessageQueue queue) 
{ 
    using (var enumerator = queue.GetMessageEnumerator2()) 
    { 
     return enumerator.MoveNext() ? enumerator.Current : null; 
    } 
} 

Chúng tôi sử dụng mã như bản gốc để kiểm tra khoảng hai mươi hàng đợi khác nhau.Kể từ khi chúng tôi thay đổi từ việc thực hiện ban đầu với một trong những tôi đề nghị, tốc độ nhập khẩu của chúng tôi tăng mạnh kể từ khi CPU có thể được sử dụng nhiều hơn để xử lý tin nhắn thay vì xử lý ném.

+0

Đây phải là câu trả lời được chấp nhận. –

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