我使用的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