2016-10-04 130 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