C# MSMQ-接收完成-异步处理消息

C# MSMQ-接收完成-异步处理消息,c#,asynchronous,async-await,msmq,C#,Asynchronous,Async Await,Msmq,我正在使用BeginnReceive方法和ReceiveCompleted eventhandler来侦听和处理来自MSMQ的消息 我已将BeginReceive方法放在ReceiveCompleted eventhandler的开头 看起来它在我的控制台应用程序中运行良好。 现在,消息是异步处理的 问题: 关于线程安全,这是否安全? 我看到的所有示例都将BeginReceive调用放在已完成的eventhandler的末尾。所以我问自己,当把它放在完成的处理程序的最开始时,有什么问题吗 pri

我正在使用BeginnReceive方法和ReceiveCompleted eventhandler来侦听和处理来自MSMQ的消息

我已将BeginReceive方法放在ReceiveCompleted eventhandler的开头

看起来它在我的控制台应用程序中运行良好。 现在,消息是异步处理的

问题: 关于线程安全,这是否安全?
我看到的所有示例都将BeginReceive调用放在已完成的eventhandler的末尾。所以我问自己,当把它放在完成的处理程序的最开始时,有什么问题吗

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可能会阻塞,并且可能会进一步执行调用,但我看不到您会利用它,因为调用processmessageasync后您没有做任何事情,因此,如果您问线程是否安全,线程将执行此操作是的,但异步方法没有充分利用

您能否解释此答案的含义,以及它如何回答OP的问题请在您的答案中添加更多细节。说“是的,您的方法将起作用”只是一个注释。BeginRecieve异步侦听,每次新消息到达时,都会调用完成的处理程序。例如,如果15条消息连续到达,它们都会在几秒钟内执行。问题是,它们是否都由工作负载中共享的一个线程执行,看起来是这样的..代码中的多线程访问在哪里,以了解和衡量影响BeginReceive在异步处理中用于在队列中有消息时引发ReceiveCompleted事件。在异步问题上,我不是那么多才多艺。。因此,在遇到麻烦之前,我最好先问一下。如果顺序很重要,我可以将BeginReceive放在末尾,并使用
任务调用ProcessMessageAsync。运行
…您的理解不正确,
Async wait
依赖于基于硬件的并发机制IO完成端口。这没有任何软件线程,但在后台仍然是并发的。在创建3个或更多的
Async
调用之前,
使用
Task为所有调用等待
。当所有
(返回复合
Task
)在执行开始后,它们将以并发模式执行。在粘贴的代码中,我没有发现任何多线程问题,单个对象
mq
,注册事件,发布通知,它同步地
BeginReceive
,然后以异步模式等待web服务调用。还请注意,web服务是一个IO调用,通过
任务调用。Run
将没有什么用处,因为用于计算处理的线程将只等待IO调用返回。在您完整的代码片段中,我看不到多个线程,这可能会导致诸如争用条件或损坏之类的问题