私は現在、長期実行メソッドをキャンセル可能にするための改良を行っています。System.Threading.Tasks.CancellationToken を使用して実装する予定です。
私たちのメソッドは通常、いくつかの長時間実行されるステップを実行します (コマンドをハードウェアに送信してから、ほとんどの場合ハードウェアを待機します)。
void Run()
{
Step1();
Step2();
Step3();
}
キャンセルに関する私の最初の(おそらくばかげた)考えは、これを次のように変換します
bool Run(CancellationToken cancellationToken)
{
Step1(cancellationToken);
if (cancellationToken.IsCancellationRequested)
return false;
Step2(cancellationToken);
if (cancellationToken.IsCancellationRequested)
return false;
Step3(cancellationToken);
if (cancellationToken.IsCancellationRequested)
return false;
return true;
}
率直に言って恐ろしく見えます。この「パターン」は、単一のステップ内でも続きます (そして、それらは必然的にすでにかなり長くなっています)。推奨されていないことはわかっていますが、これにより Thread.Abort() はかなりセクシーに見えます。
多くのボイラープレート コードの下にあるアプリケーション ロジックを隠さない、これを達成するためのよりクリーンなパターンはありますか?
編集
ステップの性質の例として、Run
メソッドは次のように読むことができます。
void Run()
{
GiantRobotor.MoveToBase();
Oven.ThrowBaguetteTowardsBase();
GiantRobotor.CatchBaguette();
// ...
}
連携するために同期する必要があるさまざまなハードウェア ユニットを制御しています。