2016-10-04 2 views
-1

Я использую метод BeginnReceive и обработчик событий ReceiveCompleted для прослушивания и обработки сообщений из MSMQ.MSMQ - ReceiveCompleted - Сообщения процесса async

Я положил метод BeginReceive в начале обработчика событий ReceiveCompleted.

Похоже, он отлично работает в моем консольном приложении. Прямо сейчас сообщения обрабатываются асинхронно.

Вопрос: Является ли это безопасным в отношении безопасности резьбы?
Все примеры, которые я видел, вызывают вызов BeginReceive до конца обработчика пройденного события. Поэтому я спрашиваю себя, есть ли какие-либо проблемы, когда ставить его в самом начале обработанного обработчика?

private void InitializeQueue() 
{ 
    try 
    { 
     _mq = MessageQueue.GetPrivateQueuesByMachine(_queueServerName).Where(qu => qu.Path == _queueAddress).FirstOrDefault(); 
     _mq.Formatter = new BinaryMessageFormatter(); 
     _mq.ReceiveCompleted += MessageReceiveCompleted; 

    } 
    catch (Exception ex) 
    { 
     Trace.WriteLine("Failed to initialize Queue!" + Environment.NewLine + " Error:" + Environment.NewLine + ex.Message); 
     throw; 
    } 
} 


async void MessageReceiveCompleted(object sender, ReceiveCompletedEventArgs e) 
{ 
    _mq.BeginReceive(); 
    try 
    {  
     await ProcessMessageAsync(e.Message); 
    } 
    catch (Exception ex) 
    { 
     Trace.WriteLine("Error occured during report fetching:" + Environment.NewLine + ex.Message); 
     throw; 
    } 
} 
+0

Где находится доступ к Multi Thread в вашем коде, чтобы понять и оценить влияние. –

+0

BeginReceive используется для асинхронной обработки, чтобы поднять событие ReceiveCompleted, когда сообщение доступно в очередь. Я не настолько универсален, когда дело доходит до асинхронных вопросов. Поэтому я лучше спрошу, прежде чем я попаду в беду. – Legends

+0

Если вопросы заказа, я могу положить BeginReceive в конец и вызвать ProcessMessageAsync с помощью 'Task.Run' ... – Legends

ответ

1

Да, ваш подход с async/await будет обрабатывать потоки safeely.C# асинхронный подход с этими ключевыми словами будет зависеть. Более конкретно о моем ответе метод обработчика события messagereceived (имя метода должен заканчиваться асинхронными вызовами) и ожидает по асинхронному методу, если в этом методе есть какая-либо блокирующая работа, поток там приостанавливается и выполняется дальше, пока другая работа не завершится и возвращает, как в этом случае async processmessage может блокировать и может быть дальнейшее выполнение вызова, но я не вижу, чтобы вы использовали его, поскольку после вызова processmessageasync вы ничего не делаете, поэтому поток будет выполняться, если вы спросите, является ли это потокобезопасным да, но асинхронный подход не полностью задействован.

+1

Можете ли вы объяснить, что означает этот ответ, и как он отвечает на вопрос OP –

+1

Пожалуйста, добавьте еще несколько подробно к вашему ответу. Высказывание «Да, ваш подход будет работать» - это просто комментарий. –

+0

BeginRecieve прослушивает асинхронно, и каждый раз, когда приходит новое сообщение, вызывается завершенный обработчик. Например, если 15 сообщений поступают в строку, все они выполняются через пару секунд. Вопрос в том, будут ли они выполняться одним потоком, разделяемым между рабочей нагрузкой, кажется, так .. – Legends

Смежные вопросы