MSMQ - receivcompleted -异步处理消息

本文关键字:消息 处理 receivcompleted MSMQ 异步 | 更新日期: 2023-09-27 18:11:34

我正在使用BeginnReceive方法和ReceiveCompleted eventandler来监听和处理来自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;
    }
}

MSMQ - receivcompleted -异步处理消息

是的,你使用async/await的方法会安全地处理线程,使用这些关键字的c#异步方法会很小心。更具体地说,我的答案事件处理程序方法messagerreceived(方法名称应该以async结束)调用和等待异步方法,如果有任何阻塞工作在这个方法内部的线程,它的暂停在那里,并执行进一步,直到其他工作完成并返回,比如在这个例子中,processmessageasync可能会阻塞调用可能会有进一步的执行但我没有看到你利用它因为调用processmessageasync之后你什么也没做,所以如果你问它是否线程安全,线程会执行这个但是异步方法没有充分利用