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