2016-09-26 68 views
0

我使用UWP StreamSocket發現了一個非常奇怪的異常,該代碼按預期工作的時間爲99.9%,並且與設備的通信正常工作,但是我每遇到一次而。UWP StreamSocket ConnectAsync異常0xC00D36FF

異常消息:

,因爲指定的工作隊列ID和標誌的組合無效操作失敗。 (異常來自HRESULT:0xC00D36FF)

示例代碼的問題: Screenshot

堆棧跟蹤:

at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.GetResult() 
    at Analyzer.<SendMessageAsync>d__120.MoveNext() in zzz.cs:line 779 

using (StreamSocket analyzerSocket = new StreamSocket()) 
{ 
    HostName hostName = new HostName(host); 

    // Set NoDelay to false so that the Nagle algorithm is not disabled 
    analyzerSocket.Control.NoDelay = false; 

    try 
    { 
     // Connect to the server 
     await analyzerSocket.ConnectAsync(hostName, port.ToString()).AsTask(new CancellationTokenSource(_timeout).Token); 
    } 
    catch (Exception e) 
    { 
     var x = e; 
    } 
} 

代碼異常截圖

我試過我的GoogleFu,並且能夠找到MediaPlayer或Linux kernals的問題,但似乎沒有涉及StreamSockets的這個問題。

雖然我可以捕獲此錯誤並解決此問題,但我想知道發生了什麼情況,以防萬一它是更大問題的症狀。

在此先感謝。

編輯1

我想這可能基於「//而且如果任務發生故障或取消拋出異常。」代碼註釋涉及到http://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/TaskAwaiter.cs,be57b6bc41e5c7e4

但是我時,我沒有使用 「.AsTask(新CancellationTokenSource(timeout.Value).Token)」

編輯仍然得到這個expcetion 2

當我有這樣的一個循環,不斷髮送消息到我們的設備,消息正在接收,直到發生這種異常。一旦發生異常並且我告訴它繼續並再次嘗試,異常會在循環中重複出現,設備將停止接收消息。

編輯3

所以我嘗試以下,以連接到不同的設備,與StreamSocket對象的不同實例...它產生同樣的錯誤!

using (StreamSocket analyzerSocket = new StreamSocket()) 
{ 
    HostName hostName = new HostName(host); 

    // Set NoDelay to false so that the Nagle algorithm is not disabled 
    analyzerSocket.Control.NoDelay = false; 

    try 
    { 
     // Connect to the server 
     await analyzerSocket.ConnectAsync(hostName, port.ToString()).AsTask(new CancellationTokenSource(_timeout).Token); 
    } 
    catch (Exception e) 
    { 
     using (StreamSocket analyzerSocket2 = new StreamSocket()) 
     { 
      HostName hostName2 = new HostName("xxx.xxx.xxx.xxx"); 

      // Set NoDelay to false so that the Nagle algorithm is not disabled 
      analyzerSocket.Control.NoDelay = false; 

      // Connect to the server 
      await analyzerSocket2.ConnectAsync(hostName2, port.ToString()); 
     } 

     throw; 
    } 
} 

感覺像某種跨線程類問題的...我救命稻草,現在我不能捕獲並繞過錯誤,因爲一旦出現錯誤,我可以不再交談的設備抓我必須退出應用程序才能使其再次運行。

有沒有人有任何其他想法或確認它看起來像跨線程類型的問題?

在此先感謝。

+0

的SocketError.GetStatus方法可用於網絡錯誤由套接字操作轉換成[SocketErrorStatus枚舉](https://msdn.microsoft.com/library/windows/apps/hh701457?f = 255&MSPPError = -2147217396)的值。您可以嘗試獲取錯誤狀態並專門處理此異常。 –

+0

@ GraceFeng-MSFT謝謝你的想法,但在我的情況下,SocketError.GetStatus返回「未知」。我傾向於http://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/TaskAwaiter.cs,be57b6bc41e5c7e4是基於此評論的問題「//如果任務出現故障或取消,則拋出異常「... –

+0

這就是MF_E_INVALID_WORKQUEUE。一個只由Media Foundation生成的錯誤代碼。支持媒體播放的Windows組件。異常的堆棧跟蹤很差,但與網絡錯誤有關的可能性應該爲零。 –

回答

相關問題