「マネージャー」のようなクラスのクラスがあります。その機能の1つは、クラスの長時間実行プロセスをシャットダウンする必要があることを通知することです。これは、クラスに「IsStopping」というブール値を設定することによって行われます。
public class Foo
{
bool isStoping
void DoWork() {
while (!isStopping)
{
// do work...
}
}
}
さて、DoWork()は巨大な関数でした、そして私はそれをリファクタリングすることに決めました、そしてプロセスの一部としてそれのいくつかを他のクラスに分割しました。問題は、これらのクラスの一部には、isStoppingがtrueであるかどうかをチェックする必要がある長時間実行される関数もあることです。
public class Foo
{
bool isStoping
void DoWork() {
while (!isStopping)
{
MoreWork mw = new MoreWork()
mw.DoMoreWork() // possibly long running
// do work...
}
}
}
ここでの私のオプションは何ですか?
isStoppingを参照で渡すことを検討しましたが、外部オブジェクトが必要なため、あまり好きではありません。私は、追加のクラスを可能な限りスタンドアロンで依存性のないものにすることを望んでいます。
isStoppingプロパティを作成してから、内部クラスをサブスクライブできるイベントを呼び出すことも検討しましたが、これは非常に複雑に思えます。
もう1つのオプションは、.net 4タスクが使用するものと同様の「プロセスキャンセルトークン」クラスを作成し、そのトークンをそれらのクラスに渡すことでした。
この状況にどのように対処しましたか?
編集:
また、MoreWorkには、実行時間の長い可能性のあるメソッドをインスタンス化して呼び出すEvenMoreWorkオブジェクトがある可能性があることも考慮してください。私が探しているのは、呼び出しツリーの下にある任意の数のオブジェクトに信号を送って、実行中の処理を停止し、クリーンアップして戻るように指示できる方法だと思います。
EDIT2:
これまでの回答ありがとうございます。使用する方法については実際のコンセンサスがないようで、誰もが異なる意見を持っています。これはデザインパターンのようです...