2011-02-07 7 views
6

async/awaitコンテキストのキャンセルトークンではなく、進行中の非同期操作をキャンセルするメカニズムを使用することができます。私はこれが言語の本質的な性質を考慮したうまく研究された設計決定だと確信していますが、実際にはキャンセルオブジェクトをすべての非同期メソッドに渡す必要があります。 C#コミュニティからの別のデザインアイデアがありますか、または提案されているキャンセルメカニズムは問題ありませんか?私は何かが足りないと思う。async/cancellationメカニズムをキャンセルする

+0

キャンセルトークンを使用した取り消しメカニズムは、非同期のC#5 CTPを含む物事の方向にあるようです。 http://msdn.microsoft.com/en-us/vstudio/gg316360それはC#5とは呼ばれませんが、ここではC#の「次の」バージョンを示すために使用しています。 –

+0

質問に「await」を使用していることに気がついたので、CTPについてよく知っています。私はTask Parallel Library(.NET 4)のような機能を提供していることを確認しました。Async CTPは同じパラダイムを使用しています。 –

+0

関連:http://stackoverflow.com/q/4914374/60761 –

答えて

4

キャンセルトークンは、特に非同期プロセスが高価である場合、プリセット終了条件がない場合、または外部リソースが関係する場合のベストプラクティスです。

しかし、望むのであれば、単に「あきらめる」ことができます。処理を中止してクリーンアップするように非同期スレッドに指示する代わりに、単に「タイムアウト」します。それが完了するのを待つのをやめ、すべてのリスナーを切り離し、実行し続ける。最終的にスレッドが完了すると、スレッドはイベントをチェックし、誰も聞いていないことを認識して、静かに終了します。それは同点、バックグラウンドで実行し続けるだろう、

  • あなたが停止するように指示しない限り、非同期プロセスは永遠に処理を続ける場合は、次の利点は、しかし、これは悪いことだろうここで多くの状況があり、シンプルでありますアプリケーションが終了するまで、CPUとその他のリソースを解放します。その時点で、スレッドは強制終了されます。
  • 非同期スレッドがDB操作などの可逆的で可逆な作業単位を実行している場合、ユーザーがキャンセルを押すと、これまで実行されたことがロールバックされたものと予想されます。リスニングをやめて移動すると、彼らは彼らが取り消したと思ったことが実行されたということになります。
  • ほとんどの場合、非同期操作には作業に時間がかかり、適切なクリーンアップが必要な外部リソースが含まれます。ネットワークソケットを切断したり、DB接続をクローズしたり、ファイルをロック解除したりする必要があります。これを処理する必要はありませんが、スレッドを正常終了させる代わりに、一般的なユーザーエクスペリエンスは、操作をキャンセルしてから再試行してください。これは、以前の非同期操作で使用していたリソースを再度使用するために解放する必要があることを意味します。
1

非同期操作のキャンセルを意味するようにするには、キャンセルトークンを確認して自身の動作を停止する操作が行われているため、その操作は慎重な手順を実行する必要があります。私。キャンセルトークンは単にasync/awaitのメカニズムではなく実装されるパターンに過ぎません。

これは、非同期操作が完了ハンドルを持つ1つのI/O呼び出しである場合、キャンセルするのではなく、あきらめてもよいことを意味します。その呼び出しが戻ってくる時点では、何も得られません。

キャンセルトークンを検討するときは、キャンセルをサポートすることでこの操作を効率化できるかどうか、または完了するのを待たずに(つまり、タイムアウトメカニズムを使用する)

関連する問題