2017-02-22 39 views
0

我正在使用實施此階段的URL how-can-i-read-messages-from-a-queue-in-parallel,它運行良好,當我用過之前,有一段時間後它不工作,我不'不明白髮生了什麼?花時間後,我斷定程序停止在特定的方法。Task.StartNew.ReceiveAsync()從MSMQ接收郵件時無法正常工作

/// <summary> 
    /// APM -> TAP conversion for MessageQueue.Begin/EndPeek. 
    /// </summary> 
    private static Task<Message> PeekAsync(MessageQueue messageQueue) 
    { 
     return Task.Factory.FromAsync(messageQueue.BeginPeek(), messageQueue.EndPeek); 
    } 

當我註釋掉上RunAsync()這個方法實施,並呼籲ReceiveAsync()方法

/// <summary> 
    /// APM -> TAP conversion for MessageQueue.Begin/EndReceive. 
    /// </summary> 
    private static Task<Message> ReceiveAsync(MessageQueue messageQueue, TimeSpan timeout) 
    { 
     return Task.Factory.FromAsync(messageQueue.BeginReceive(timeout), messageQueue.EndPeek); 
    } 

然後程序終止,沒有例外,沒有任何事情發生。簡單的程序被終止。

從礦井的角度Task.Factory.FromAsync()是一個原因,但不是不受歡迎的原因?

如果我使用與接收消息相同的隊列作爲BeginReceive() eventhandler它工作正常。如何識別這個?

+0

您可以訂閱UnhandledException當前'AppDomain' – VMAtm

回答

0

ReceiveAsync函數中,第二個參數FromAsync應該是messageQueue.EndReceive而不是messageQueue.EndPeek

+0

ü是正確的,我也實現同樣的事情也有,但是不工作 – Faraz

0

第一件事第一件事。

正如@xwlantian指出的那樣。你把你的APM方法混合起來。

您應始終將您的BeginXXX與正確的EndXXX方法相匹配。否則你會得到一個異常。

在你的情況

Task.Factory.FromAsync(messageQueue.BeginReceive(timeout), messageQueue.EndPeek) 

應改爲

Task.Factory.FromAsync(messageQueue.BeginReceive(timeout), messageQueue.EndReceive) 

但是,你應該已經能夠解決這個問題你自己,如果你有正確的信息(異常/堆棧跟蹤)。你聲稱失蹤。

這是不正確的。

您沒有看到異常的原因是Visual Studio對您的異常沒有break(這是您「發現」異常的典型方式)。相反,你可以看看你的Windows事件查看器,你應該在那裏找到異常。

你爲什麼不「看」異常?

以下是真實發生的,沒有的try/catch對堆棧向上後臺線程

  1. 你例外。
  2. 您在AppDomain上沒有異常處理程序。
  3. 您在「調試」設置中選中「Just My Code」。
+0

我與同對也測試了它,但無法正常工作。我通過你以後給出的信息檢查 – Faraz

+0

但是如何測試'Task.Factory.FromAsync (messageQueue.BeginReceive(timeout),messageQueue.EndReceive);'因爲它是新的任務,它的實現是隱藏的,當調試器運行這一行時。請解釋 – Faraz

+0

你看看我告訴你看的例外嗎?我的心理能力只能帶我到目前爲止。如果您需要更多幫助,請給我您的異常/堆棧跟蹤。 – Aron