2016-10-04 84 views
-1

我使用的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; 
    } 
} 
+0

代码中的多线程访问权在哪里,以了解和评估影响 –

+0

BeginReceive用于异步处理,以在消息可用时引发ReceiveCompleted事件队列。当涉及到异步问题时,我不是那么灵活..所以我最好在问题出现之前问一问。 – Legends

+0

如果顺序很重要,我可以将BeginReceive放在最后,并使用Task.Run调用ProcessMessageAsync ... – Legends

回答

1

是的你的方法与异步/ await将安全地处理线程。#与这些关键字的异步方法将照顾。 对于我的回答,更具体的事件处理程序方法messagereceived(方法名称应该以async结尾)调用并等待异步方法,如果此方法中存在任何阻塞工作,则它将挂起的线程将继续执行,直到其他工作完成并返回,就像在这种情况下,processmessage异步可能被阻塞,并且可能会进一步执行调用,但我没有看到你利用它,因为在调用processmessageasync之后你没有做任何事情,所以如果你有线程执行这个询问是否线程安全是,但异步方法未充分利用

+1

你能解释一下这个答案的含义吗?它如何回答OP的问题 –

+1

请添加更多细节给你的答案。说“是的,你的方法会起作用”只是一个评论。 –

+0

BeginRecieve异步侦听,每次有新消息到达时,调用完成的处理程序。例如,如果15条消息连续到达,它们都会在几秒钟内完成执行。问题是,它们是否都会通过工作负载之间共享的一个线程执行,似乎是这样。 – Legends