2016-09-26 31 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组件。异常的堆栈跟踪很差,但与网络错误有关的可能性应该为零。 –

回答

相关问题