メソッドをBackgroundWorker
呼び出すメソッドを呼び出す があります...そして、チェックした行のどこかでCancellationPending
を終了したいと思いBackgroundWorker
ます。
その深くネストされたメソッドから直接それを行う方法はありますか、それとも呼び出し元に戻る必要がありますか?
メソッドをBackgroundWorker
呼び出すメソッドを呼び出す があります...そして、チェックした行のどこかでCancellationPending
を終了したいと思いBackgroundWorker
ます。
その深くネストされたメソッドから直接それを行う方法はありますか、それとも呼び出し元に戻る必要がありますか?
を使用しているという事実について特別なことは何もありませんBackgroundWorker
- これについては、深くネストされたメソッド呼び出しを処理するのと同じ用語で考えてください。
言い換えれば、いいえ、それを直接行うために私が考えることができる(恐ろしいものではない)方法はありません。
私が考えることができる最もクリーンな方法はCancellationPending
、ネストされた各メソッドから戻った直後に、すべてのレベルで (および if true
、 return) を単純にチェックすることです。
特定の例外をスローし、最上位で同じ特定の例外タイプをキャッチすると、すぐに解決できますが、ベスト プラクティスとは言えません (つまり、通常のフロー制御のように例外以外の例外を使用しないでください)。
メソッドを呼び出すメソッドを呼び出す BackgroundWorker ...
その深くネストされたメソッドから直接 [キャンセル] する方法はありますか
例外をスローできます。しかし、それは、エラーに対してのみ例外を使用するという一般的なアドバイスとの境界線です。
できますが、すべきではありません。
他の回答で述べたように例外をスローすることは別として、あえて誰も話さない名前の悪はThread.Abort()です。BackgroundWorker スレッドで実行されている関数からこれを呼び出すと、スレッド全体が終了します。Thread.Abort() の弊害については、このサイトの他の場所で詳しく説明されています。
そうは言っても、正しいことは、深くネストされた関数がスレッドを終了する必要があると判断したときに、この意図がスタックを介してメイン スレッド メソッドに伝達され、クリーンに終了できるようにコードを構造化することです。
これには多くの方法があります。私はこの実装を好みますが、引数を少し制限しますが、それは変更できます。BackgroudWorker
主なポイントは、への参照をパラメーターとして渡すことです。
bkgw = new BackgroundWorker();
bkgw.DoWork += new DoWorkEventHandler(bkgw_DoWork);
bkgw.WorkerSupportsCancellation = true;
void bkgw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker b = (BackgroundWorker)sender;
if (b.CancellationPending)
{
e.Cancel = true;
return;
}
if (!Method1(b))
{
e.Cancel = true;
return;
}
if (b.CancellationPending)
{
e.Cancel = true;
return;
}
}
bool Method1(BackgroundWorker caller)
{
//some code
if (caller.CancellationPending)
return false;
if (!Method2(caller))
return false;
//some code
return true;
}
bool Method2(BackgroundWorker caller)
{
//some code
if (caller.CancellationPending)
return false;
//some code
return true;
}