Я использую метод 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;
}
}
Где находится доступ к Multi Thread в вашем коде, чтобы понять и оценить влияние. –
BeginReceive используется для асинхронной обработки, чтобы поднять событие ReceiveCompleted, когда сообщение доступно в очередь. Я не настолько универсален, когда дело доходит до асинхронных вопросов. Поэтому я лучше спрошу, прежде чем я попаду в беду. – Legends
Если вопросы заказа, я могу положить BeginReceive в конец и вызвать ProcessMessageAsync с помощью 'Task.Run' ... – Legends