「処理中」アニメーション画面でキャンセルを押すとすぐにメソッドを停止したいと思います。私は代理人を介して非同期呼び出しを使用しています。デリゲートを介してメソッドの実行を直ちに停止することは可能ですか?C#でデリゲートを介してメソッドをキャンセルすることはできますか
ありがとう:)
「処理中」アニメーション画面でキャンセルを押すとすぐにメソッドを停止したいと思います。私は代理人を介して非同期呼び出しを使用しています。デリゲートを介してメソッドの実行を直ちに停止することは可能ですか?C#でデリゲートを介してメソッドをキャンセルすることはできますか
ありがとう:)
いいえ - 少なくとも、きれいにはありません。 (私はThread.Abort
を「きれいな」と含めません)。あなたがするべきことは、あなたがであることを代理人に伝えるためにを試みることです。あなたのデリゲートは、時折、そのキャンセルフラグをチェックし、それに応じて反応する必要があります。
Parallel Extensionsには、その場所全体にキャンセルが組み込まれています(特にキャンセルトークンでは、適切なコードでタスクをキャンセルできます)。私が知っている限り、それはまだすべて協同組合だ。強制取り消しは、常に状態を破損するリスクを負います。
Jonがすでに述べたように、スレッドには「今はやめてください」とスレッドに従うことはできません。 Thread.Abortは停止するように指示しません。単純に "プラグを外します"。 :)
過去に私が行ったことは、スレッドのコード内に一連の "if(wehavetostop)"を追加し、ユーザーが "キャンセル"を押した場合、私はwehavetostop == trueを入れました。
あまりにもエレガントではなく、場合によっては、 "if"チェックを置くのが難しい場合があります。特に、スレッドが分割できない「長い」操作を実行している場合。
ネットワーク接続を確立しようとすると(時間がかかります)、スレッドの「異常な」終了が破損状態を引き起こさないと思われる場合は、使用することができますが、そのスレッドに関係していたことの状態を信頼してください。
System.ComponentModel.BackgroundWorkerを使用できます。ボイラープレートコードを書く必要がないように、キャンセルをサポートしています。クライアントコードは単にCancelAsynメソッドを呼び出すことができ、クライアントが操作をキャンセルして救済するかどうかを決定するのが適切なときに、コード内のCancellationPendingプロパティをチェックすることができます。