我使用UWP StreamSocket获得了一个非常奇怪的异常,99.9%的时间此代码按预期运行并且与设备的通信正常工作,但我偶尔会得到以下异常。< / p>
异常消息:
操作失败,因为指定了工作队列ID和标志的无效组合。 (来自HRESULT的异常:0xC00D36FF)
问题的示例代码:
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;
}
}
堆栈跟踪:
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
我已经尝试了我的GoogleFu,我能够找到MediaPlayer或Linux内核的问题,但似乎与StreamSockets的这个问题没什么关系。
虽然我可以捕捉到这个错误并解决这个问题,但我想知道在发生更大问题的情况下会发生什么。
提前致谢。
修改1
我认为这可能与http://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/TaskAwaiter.cs,be57b6bc41e5c7e4基于&#34;的代码注释有关。如果任务出现故障或被取消,则抛出异常。&#34;。
然而,当我没有使用&#34; .AsTask(new CancellationTokenSource(timeout.Value).Token)&#34;
时,我仍然会得到这种说法。修改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 :(得分:0)
我发现防止此问题的唯一方法是停止使用&#34; StreamSocket&#34;共
我将代码切换为使用&#34; System.Net.Sockets&#34;使用Socket对象的命名空间,以及对我的代码的一些修改,我从未遇到过这个问题。
代码示例: