[英]MSMQ Application does not process queued messages when running as Windows Service
[英]MSMQ - ReceiveCompleted - Process Messages async
我正在使用 BeginnReceive 方法和 ReceiveCompleted 事件處理程序來偵聽和處理來自 MSMQ 的消息。
我已將 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;
}
}
是的,您使用 async/await 的方法將安全地處理線程。使用這些關鍵字的 c# 異步方法會很小心。 更具體地說明我的回答,事件處理程序方法 messagereceived(方法名稱應以 async 結尾)調用並等待 async 方法,如果此方法內有任何阻塞工作,則線程將在那里暫停並進一步執行,直到其他工作完成和返回,就像在這種情況下 processmessage async 可能會阻塞並且可以進一步執行 call 但我沒有看到你利用它,因為在調用 processmessageasync 之后你沒有做任何事情,所以如果你問,線程將執行這個如果它是線程安全的,是的,但沒有充分利用異步方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.