我使用的BeginnReceive方法和ReceiveCompleted事件处理程序倾听和从MSMQ处理消息。MSMQ - ReceiveCompleted - 处理消息异步
我已经把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;
}
}
代码中的多线程访问权在哪里,以了解和评估影响 –
BeginReceive用于异步处理,以在消息可用时引发ReceiveCompleted事件队列。当涉及到异步问题时,我不是那么灵活..所以我最好在问题出现之前问一问。 – Legends
如果顺序很重要,我可以将BeginReceive放在最后,并使用Task.Run调用ProcessMessageAsync ... – Legends