1

StreamSocketListenerを使用してポート上の接続を待機しています。私はそれが永遠に聞くことを望んでいない、それは私が次のコードを使用している特定の秒数の後にキャンセルする必要があります。指定したタイムアウト後にタスクがキャンセルされない

remoteListener = new StreamSocketListener(); 
    try 
    { 
     CancellationTokenSource ctsTimeout = new CancellationTokenSource(); 
     ctsTimeout.CancelAfter(1000); // in milliseconds 
     await remoteListener.BindServiceNameAsync(receivingPortForRemoteRequests.ToString()).AsTask(ctsTimeout.Token); 
     remoteListener.ConnectionReceived += remoteListener_ConnectionReceived; 
    } 
    catch (Exception exc) // supposed to produce a TaskCanceledException 
    { 
     isCancelled = true; 
    } 

私の問題は、このコードは、任意の時間間隔の後Exceptionをスローすることはありませんということですが、ちょうど聴き続けています。コードは、私がthis MSDN pageから見つけたものに基づいています。

誰かが間違っていることを知っていますか?前もって感謝します!

+1

私はオフになるかもしれませんが、あなたはまたconnectasyncのいくつかの形式が必要ですか?またはStreamSocketConnectOperation(ctsTimeout.tokenをパラメータとして受け入れる) – GamerJ5

+0

@ GamerJ5ポートでTCP接続をリスンしています。 'ConnectionReceived'イベントで、私は' StreamSocket'を取得し、それを通して入出力ストリームを通してクライアントに読み書きすることができます。それは大丈夫、私はちょうどタイムアウトの後にそのポートで聞いて停止することはできません動作します。 –

+0

@ GamerJ5:クライアントによって「接続」操作が開始されます。上記のコードはサーバーからのものです。 –

答えて

2

は、私はあなたが作った主な間違いは、あなたが実際にをリッスン任意の操作をソケット結合することをタスクにキャンセルトークンを渡し、およびされていないことであると言うでしょう。バインド操作は単にポートをソケットに割り当て、通常は最悪の場合にはミリ秒で完了しますが、典型的なケースでは非常に高速です。完全な秒後にこの操作がまだ進行中である方法はありません。

あなたの質問がはっきりとわかるMinimal, Complete, and Verifiable exampleがなければ、完全な回答は不可能です。ただし、いくつかの提案:

  1. まず、キャンセルトークンを使用しないでください。ソケットの受信を止める方法ではありません。代わりに、必要な時間の後にソケットを閉じてください。この目的のためにタイマーを使用するか、最初にawait Task.Delay(...)を呼び出してソケットを閉じるasyncメソッドを使用できます。
  2. 今後、キャンセルトークンを使用するシナリオが適切な場合は、TaskCanceledExceptionだけをキャッチする必要があります。 しない通常の例外処理にはcatch (Exception)を使用します。適切な唯一の場所は、単に例外をログに記録したり、例外を報告したりしてプロセスを終了させるシナリオです。それ以外の場合は、予期している例外処理だけをキャッチし、処理の計画を立ててください。
  3. イベントにサブスクライブしてから、ソケットをバインドする必要があります。さもなければ、あなたのコードがイベントを介して通知される準備が整う前に、接続の試行が行われる可能性が(非常に小さい、許可された)チャンスがあります。

上記の第1および第3の点は、このクラスの適切な使用方法の有用な要約を記載したMSDNのドキュメントに記載されています。 the documentation for StreamSocketListenerから次のように

操作の典型的な順序は次のとおりです。
•StreamSocketListenerを作成します。
•Controlプロパティを使用してStreamSocketListenerControlオブジェクトを取得し、必要なソケットサービス品質を設定します。
•ConnectionReceivedイベントをイベントハンドラに割り当てます。
•BindServiceNameAsyncメソッドまたはBindEndpointAsyncメソッドを呼び出して、ローカルTCPポート番号またはサービス名にバインドします。 Bluetooth RFCOMMの場合、ローカルサービス名パラメータはBluetoothサービスIDです。
?接続が受信されると、StreamSocketListenerConnectionReceivedEventArgsオブジェクトを使用して、作成されたStreamSocketオブジェクトを使用してSocketプロパティを取得します。
?StreamSocketオブジェクトを使用してデータを送受信します。
?Closeメソッドを呼び出すと、着信ネットワーク接続の受信と受信を停止し、StreamSocketListenerオブジェクトに関連付けられたすべてのアンマネージリソースを解放します。接続を受け取ったときに作成されたStreamSocketオブジェクトは影響を受けず、必要に応じて引き続き使用できます。

+0

詳細な返信とヒントありがとう!私はあなたの最初のポイントを実装することによってそれを働かせました。 –

関連する問題