Я хочу иметь возможность читать и обрабатывать сообщения из MSMQ. Очереди транзакционные. В настоящее время я использую этот код:
while (true)
{
using (var txn = new MessageQueueTransaction())
{
txn.Begin();
try
{
var message = queue.Receive(txn);
Dispatch(message);
txn.Commit();
}
catch (MessageQueueException ex)
{
txn.Abort();
}
}
}
Где queue
является System.Messaging.MessageQueue
.
Я бы хотел, чтобы цикл использовал while (!cancelled)
, что означало бы вызов queue.Receive
той перегрузки, которая принимает тайм-аут. Тем не менее, код сбрасывает, когда истекает время ожидания, и выбрасывание стольких исключений не может быть хорошей вещью. Есть ли TryRecieve
, похожий на Monitor.TryEnter
? Peek, кажется, самый близкий, но он также бросает, когда тайм-аут достигнут.
Если я хочу считывания с высокой пропускной способностью из очереди и поддержки отмены, каков наилучший способ чтения из очереди?