2014-04-22 19 views
7

Tôi có thư bị kẹt trong hàng đợi và tôi đang tìm cách xóa chúng theo cách lập trình.Làm cách nào để xóa thư khỏi hàng đợi?

Có cách nào để xóa thư khỏi hàng đợi nếu thư đó đã được đặt trong hơn x ngày không? Tôi có thể kết nối và xóa hàng đợi như thế này, nhưng không chắc chắn cách xóa từng thư.

MessageQueue queue = new MessageQueue(@".\private$\SomeTestName"); 
//queue.Purge(); //deletes the entire queue 
try 
{ 
    // Peek and format the message. 
    Message m = myQueue.Peek(); 

    // Display message information. 
    Console.WriteLine("Sent time {0}", m.SentTime); 
    Console.WriteLine("Arrived time {0}", m.ArrivedTime); 
} 
+0

thể trùng lặp của [? Làm thế nào để loại bỏ thông điệp từ hàng đợi thông điệp (chỉ khi nó cũng được định dạng)] (http://stackoverflow.com/questions/5115832/how-to -remove-message-from-message-queue-only-if-its-well-format) – OldProgrammer

Trả lời

8

Không có API nào để thực hiện việc này. Nhưng bạn có thể sử dụng

Một lợi ích của việc sử dụng liệt kê ở đây là nếu một hàng đợi có nhiều bài viết, đọc tất cả trong số họ có thể dẫn đến OutOfMemoryException. Với điều tra viên bạn chỉ đọc 1 tin nhắn cùng một lúc và bộ nhớ được cấp cho nó có thể được sử dụng lại.

Bí quyết khác để tăng hiệu suất là chỉ định thuộc tính cần đọc, để nếu nội dung thư lớn và bạn không quan tâm đến nội dung, bạn có thể vô hiệu hóa đọc nội dung đó.

var enumerator = _queue.GetMessageEnumerator2(); // get enumerator 
var staleDate = DateTime.UtcNow.AddDays(-3);  // take 3 days from UTC now  
var filter = new MessagePropertyFilter();   // configure props to read 
filter.ClearAll();        // don't read any property 
filter.ArrivedTime = true;      // enable arrived time 
_queue.MessageReadPropertyFilter = filter;  // apply filter 

while (enumerator.MoveNext())  
    if(enumerator.Current.ArrivedTime.Date >= staleDate) 
     enumerator.RemoveCurrent(); 
+0

ý của bạn là gì bởi "GetEnumerator2 không loại bỏ tin nhắn? –

+0

MessageQueue không chứa định nghĩa cho removebyid –

+0

No prob :), I nhận được lỗi này 'Property ArrivedTime không được lấy ra khi nhận được thông báo' trên dòng này' if (msg.ArrivedTime.Date> = staleDate) 'bạn có biết tại sao? –

0

Gọi GetAllMessages và thêm séc để tìm thư của bạn và thực hiện thao tác xóa trên thư đó. Mẫu mã,

Message[] messages = msgQueue.GetAllMessages(); 
    foreach (Message msg in messages){ 
     doSomething(); 
    } 
1

Tôi nghĩ rằng bạn có thể làm một cái gì đó như thế này:

MessageQueue queue = new MessageQueue(@".\private$\SomeTestName"); 
var messages = queue.GetAllMessages(); 
var messagesToDelete = messages.Where(m => m.ArrivedTime < DateTime.Now.AddDays(-1)).ToList(); 
messagesToDelete.ForEach(m=>queue.ReceiveById(m.Id)); 

Rõ ràng, bạn sẽ phải thay đổi những thứ ngày tương ứng với kịch bản của mình.

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