MSMQ получает таймауты от .NET - PullRequest
4 голосов
/ 25 апреля 2011

Я хочу иметь возможность читать и обрабатывать сообщения из 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, кажется, самый близкий, но он также бросает, когда тайм-аут достигнут.

Если я хочу считывания с высокой пропускной способностью из очереди и поддержки отмены, каков наилучший способ чтения из очереди?

Ответы [ 2 ]

3 голосов
/ 25 апреля 2011

Используйте MessageQueue.BeginPeek () вместо этого. Обработчик события, который вы пишете для события PeekCompleted, запустится, как только будет доступно сообщение. Вы можете вызвать Receive () и быть уверенным, что получите сообщение без тайм-аута. В статье MSDN Library есть хороший пример.

1 голос
/ 26 апреля 2011

Не прямой ответ, но я бы использовал протокол net.msmq в WCF, чтобы выполнить обработку messageQ.Это аккуратный простой подход, который может удовлетворить все сценарии, которые вы упомянули здесь.

...