完了するのに約1分かかるタスクとサブタスクの複雑なツリーを実行するバックグラウンドワーカースレッドを生成するUIがあります。
要件は、バックグラウンドワーカータスクが開始されたらキャンセルできる必要があることです。
現時点では、私の解決策は素朴で、コードを混乱させています。UIでキャンセルボタンを押すと、キャンセルトークンが設定されます。ワーカースレッドは定期的に(タスク間で)このトークンをポーリングし、設定されている場合は終了します。
void ThreadWorkerHandler(CancelToken cancelToken)
{
DoTask1(cancelToken);
if (cancelToken.IsSet)
return;
DoTask2(cancelToken);
if (cancelToken.IsSet)
return;
DoTask3(cancelToken);
if (cancelToken.IsSet)
return;
DoTask4(cancelToken);
}
void DoTask2(CancelToken cancelToken)
{
DoSubTask2a();
if (cancelToken.IsSet)
return;
DoSubTask2b();
if (cancelToken.IsSet)
return;
DoSubTask2c();
if (cancelToken.IsSet)
return;
}
より良い解決策はありますか?私は、チェックインを自動的にペッパーし、条件が満たされた場合に内部例外を自動的に発生させるSoLongAsステートメントのようなものを探していました。これは、ループの最後で内部的にキャッチされます。例:
void ThreadWorkerHandler(CancelToken cancelToken)
{
SoLongAs (canelToken.IsSet == false)
{
DoTask1(cancelToken);
DoTask2(cancelToken);
DoTask3(cancelToken);
DoTask4(cancelToken);
}
}
しかし、それは何らかの理由で機能しないと思います。さらに重要なことに、このようなものが実際に存在するのではないかと疑っています。そうでない場合、私が現在使用しているよりもこのシナリオを処理するためのより良い方法はありますか?ありがとう。