1

ソースコードを分析するプログラムがあります。ディレクトリを再帰的に調べてすべてのプロジェクトを見つけ、次にプロジェクトを再帰的に調べてすべてのソース コードを見つけることができます。

ユーザーがコードの解析を停止できるキャンセル プロセス ボタンを作成したいと考えています。バックグラウンド ワーカーでコードの解析を実行します。キャンセルイベントを監視できるようにしたい。

問題は、コードを編集してそのアイテムをチェックし、GUI に戻るようにする方法を考え出すことです。解析プロセスは、いくつかの方法で深くなります。

はるかに小さなプロセスで、キャンセルが要求されたかどうかを示す bool を持つスレッドセーフなシングルトンを正常に使用し、実行中のループを停止します。

このキャンセル リクエストをコードに組み込む最良の方法は何でしょうか?

編集: これは、John Saunders の回答に触発されたアイデアです。

Cancel Singleton の変更を監視する処理スレッドでバックグラウンド スレッドを実行し、そのプロセスから例外をスローするとどうなりますか? これは良い習慣のように思えますか? これは意図したとおりに機能しません

EDIT 2: ジョン・サンダースの答えは今のところ最良のようです。シングルトンが今のところ真の場合、私は自分の例外をスローします。他の解決策が提案されているかどうかを確認するのを待ちます

4

4 に答える 4

2

Thread.Abort は、任意の時点でスレッドを中断するため、悪い考えです。おそらく、中断されたくない場所でスレッドを中断します。

キャンセルされたスレッドによって認識されたフラグを設定します。各操作の最初に確認してください。安全に停止できるコード内の場所を特定し、それらのポイントでのみフラグをチェックするという考え方です。

これらの時点で例外をスローすると便利な場合があります。例外は、コードと UI の間の境界に到達するまで、コードによってキャッチされないものでなければなりません。その時点で、コードは単純に戻ります。

于 2009-03-25T17:33:10.327 に答える
0

Thread.Abort()バックグラウンド ワーカー スレッドで関数を使用できます。これは、ThreadAbortExceptionどのメソッドでもキャッチできますが、catchブロックの最後で原子的に再スローされる a をスローします。

また、すべてのfinallyブロックが実行されます。

于 2009-03-25T17:26:59.450 に答える
0

スレッド操作でキャンセルを実行するには、さまざまな方法があります。これらはすべて、フラグまたはその他の値を定期的にチェックして、スレッドが動作を継続するかどうかを判断することを伴います。

この機能の例外をスローすることはお勧めしません。まず第一に、キャンセルは例外的な状況ではなく、第二に、実装しようとしているものにとってはやり過ぎです。

代わりに、任意のスレッドからアクセスできるクラスの静的メンバーとして単純なスレッド セーフなブール値フラグを使用するか、名前付きMutexなどの同期オブジェクトを使用できます。同期オブジェクトにシグナルを送信すると、スレッドはキャンセルする必要があることを認識できます。

于 2009-03-25T18:41:18.307 に答える
0

.NET backgroundworker クラスを使用しているようです。オブジェクト パラメーターを RunWorkerAsync メソッドに渡すと、DoWork イベント ハンドラー引数でバックグラウンド スレッドにアクセスできるようになると思います。

次に、UI スレッドでそのオブジェクトを変更し (たとえば、boolean キャンセル プロパティを更新する)、バックグラウンド プロセスから定期的にチェックすることができます。

于 2009-03-25T17:32:55.397 に答える