2016-09-26 6 views
0

UWP StreamSocketを使用して、非常に奇妙な例外が発生しました。このコードが期待どおりに機能し、デバイスとの通信が正常に機能する時間の99.9%ですが、しばらく。UWP StreamSocket ConnectAsync例外0xC00D36FF

例外メッセージ:ワークキューIDおよびフラグの無効な組み合わせが指定されたため

操作が失敗しました。問題の

サンプルコード:(0xC00D36FF HRESULTからの例外): 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でこの問題に関連するものは何もありませんでした。

私はこのエラーをトラップして問題を回避することができますが、より大きな問題の兆候である場合に何が起こっているのか知りたいと思います。

ありがとうございます。

私はこれが「//そしてタスクが故障またはキャンセルされた場合に例外をスローします。」のコードのコメントに基づいて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; 
    } 
} 

エラーが発生すると、私はもはやデバイスに話すことはできないとしてそれは私が今、私はトラップできないようにストローで把握し、エラーを回避しています...問題のクロススレッディングタイプのいくつかの並べ替えのように感じていますアプリケーションを終了してもう一度動作させる必要があります。

他のアイデアや問題がクロススレッド型のように見えることはありますか?

ありがとうございます。

+0

SocketError.GetStatus方法はソケット操作から[SocketErrorStatus列挙]にネットワークエラーを変換するために使用することができる(https://msdn.microsoft.com/library/windows/apps/hh701457?f = 255&MSPPError = -2147217396)の値です。エラー状態を取得し、この例外を特に処理することができます。 –

+0

@ GraceFeng-MSFT私の場合は、SocketError.GetStatusが "Unknown"を返しましたが、アイデアをありがとうございました。私はhttp://referencesource.microsoft.com/#mscorlib/system/runtime/compilerservices/TaskAwaiter.cs,be57b6bc41e5c7e4がこのコメントに基づいて問題になっていると思っています "//タスクがフォールトまたはキャンセルされた場合に例外をスローする"... –

+0

これはMF_E_INVALID_WORKQUEUEです。 Media Foundationによってのみ生成されるエラーコードです。メディア再生をサポートするWindowsコンポーネント。例外のスタックトレースは貧弱ですが、ネットワークエラーと何らかの関係があるというオッズはゼロでなければなりません。 –

答えて

0

この問題を防ぐために私が見つけた唯一の方法は、「StreamSocket」の使用をやめることです。

代わりにSocketオブジェクトを使用して "System.Net.Sockets"名前空間を使用するようにコードを変更しました。このコードを変更して以来、この問題は発生していません。

コードサンプル:

https://msdn.microsoft.com/en-us/library/windows/apps/hh202858%28v=vs.105%29.aspx?f=255&MSPPError=-2147217396

関連する問題