簡體   English   中英

MSMQ - ReceiveCompleted - 異步處理消息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM