UWP StreamSocketを使用して、非常に奇妙な例外が発生しました。このコードが期待どおりに機能し、デバイスとの通信が正常に機能する時間の99.9%ですが、しばらく。UWP StreamSocket ConnectAsync例外0xC00D36FF
例外メッセージ:ワークキューIDおよびフラグの無効な組み合わせが指定されたため
操作が失敗しました。問題の
サンプルコード:(0xC00D36FF HRESULTからの例外):
ザ・スタックトレース:
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でこの問題に関連するものは何もありませんでした。
私はこのエラーをトラップして問題を回避することができますが、より大きな問題の兆候である場合に何が起こっているのか知りたいと思います。
ありがとうございます。
私はこれが「//そしてタスクが故障またはキャンセルされた場合に例外をスローします。」のコードのコメントに基づいてhttp://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/TaskAwaiter.cs,be57b6bc41e5c7e4に関連するかもしれないと思った
1編集。私は
編集2
私はループでこれを持っている ".AsTask(新CancellationTokenSource(timeout.Value).Token)" を使用していないとき、私はまだこのexpcetionを得るしかし
常にデバイスにメッセージを送信するために、この例外が発生するまでメッセージが受信されています。例外が発生し、それを続行して再試行すると、ループ内で例外が何度も繰り返し発生し、デバイスはメッセージの受信を停止します。
編集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が "Unknown"を返しましたが、アイデアをありがとうございました。私はhttp://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/TaskAwaiter.cs,be57b6bc41e5c7e4がこのコメントに基づいて問題になっていると思っています "//タスクがフォールトまたはキャンセルされた場合に例外をスローする"... –
これはMF_E_INVALID_WORKQUEUEです。 Media Foundationによってのみ生成されるエラーコードです。メディア再生をサポートするWindowsコンポーネント。例外のスタックトレースは貧弱ですが、ネットワークエラーと何らかの関係があるというオッズはゼロでなければなりません。 –