私はトラフィック監視にPcap.Netを使用します。ユーザーがキャンセルを要求するまでパケットを受信する必要があります。私はタスクこの方法(簡体字)の監視を作成:終わりのないライブラリメソッドを含む打ち切りタスク(キャンセル要求をチェックする機能はありません)
var task1 = Task.Run(() => { communicator.ReceivePackets(0, PacketHandlerCallback); } /*, token*/);
ここ0
ことPacketHandlerCallback
は、それぞれのパケットを受信するために実行される方法であり、ReceivePackets
の実行が終了したことがないと言います。 ReceivePackets
は同期であり、キャンセルをサポートしていません。私の質問では一般的には、私たちが編集することができない他の無限の同期方法である可能性があります。
このメソッドの実行を停止する方法はありますか?
ちょうどキャンセルが要求された場合、我々はまた、明示的に、電子をチェックする必要がありますので、助けにはならないタスクにキャンセルトークンを渡します。 g。
token.throwIfCancellationRequested()
に電話してください。トークンをコールバックメソッドに渡すことは、新しいパケットを受け取るまで呼び出されないため、このメソッドは呼び出されませんが、キャンセル後すぐにタスクを停止したいと考えています。
BackgroundWorker
を使用すると、CancellationPending
にチェックする必要があるため、同じ質問が表示されます。定期的に取り消し要求をチェックし、ReceivePackets
はまだを実行されるので、その後var task = Task.WhenAny(task1, task2)
を書いても解決しないtask2
を作成。
Thread.Abort()
を使用する必要がありますか他の優雅な解決方法がありますか?
TPLについても同様の質問がありますが、私は単純で有益な答えは見つかりません。
:ドキュメントのコードから
コードがハングアップしてしまう心配はありません。すべてをクリーンアップしたいときは、コミュニケータを処分できます。 –
@Scott素晴らしい提案、ありがとうございます。私はそれが何について質問されていないことを知っているが、それは私が今必要なものです。あなたは 'while(true){communicator.ReceiveSomePackets(/ * args * /);}を書くとそれを確認してください。 token.throwIfCancellationRequested(); } 'ノンブロッキングコミュニケータの場合キャンセル要求チェック中に受信できるパケットは失われませんか? –
前にライブラリを使用したことはありません。私はソースをチェックして、プロパティとそのプロパティでメモを見ました。 –