我使用UWP StreamSocket發現了一個非常奇怪的異常,該代碼按預期工作的時間爲99.9%,並且與設備的通信正常工作,但是我每遇到一次而。UWP StreamSocket ConnectAsync異常0xC00D36FF
異常消息:
,因爲指定的工作隊列ID和標誌的組合無效操作失敗。 (異常來自HRESULT:0xC00D36FF)
堆棧跟蹤:
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;
}
}
感覺像某種跨線程類問題的...我救命稻草,現在我不能捕獲並繞過錯誤,因爲一旦出現錯誤,我可以不再交談的設備抓我必須退出應用程序才能使其再次運行。
有沒有人有任何其他想法或確認它看起來像跨線程類型的問題?
在此先感謝。
的SocketError.GetStatus方法可用於網絡錯誤由套接字操作轉換成[SocketErrorStatus枚舉](https://msdn.microsoft.com/library/windows/apps/hh701457?f = 255&MSPPError = -2147217396)的值。您可以嘗試獲取錯誤狀態並專門處理此異常。 –
@ GraceFeng-MSFT謝謝你的想法,但在我的情況下,SocketError.GetStatus返回「未知」。我傾向於http://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/TaskAwaiter.cs,be57b6bc41e5c7e4是基於此評論的問題「//如果任務出現故障或取消,則拋出異常「... –
這就是MF_E_INVALID_WORKQUEUE。一個只由Media Foundation生成的錯誤代碼。支持媒體播放的Windows組件。異常的堆棧跟蹤很差,但與網絡錯誤有關的可能性應該爲零。 –