7

私は、BackgroundWorkerスレッドが生きている(つまり、まだ実行されている。スレッドは基本的に単純な無限ループとして実装されている)ことを確認する方法を見つけようとしています。

while (AllConditionsMet())
{
  DoSomeMagic();
  Thread.Sleep(10000);
}

IsAlive()これまでに見つけたものに最も近いのはIsBusyプロパティですが、ほとんどの場合、スレッドSleep()を考えると、これでうまくいくかどうかはわかりません。

IsBusyに頼ることはできますか?

if (!myWorker.IsBusy)
  RestartWorker();

または私はトラブルを求めていますか?

4

4 に答える 4

14

BackgroundWorker.IsBusyDoWorkイベントハンドラーがビジーで、RunWorkerCompletedイベントハンドラーがまだ実行されていない限り、trueです。後者の句に注意してください。プロパティは、ループがアクティブであるかどうかを通知 しません。

さらに、2番目のスニペットにはかなり厄介な競合状態があります。IsBusyはif()ステートメントでは真である可能性がありますが、1ナノ秒後には偽になります。月に一度の種族。コードの意図をスニペットから理解するのは難しいため、回避策を提供するのは困難です。常に新しいBGWオブジェクトを作成することを検討してください。これは、競合することはありません。また、そのループを取り除くのに役立ちます。10秒間スリープしているスレッドは、何もしないために非常に高価なシステムリソースを浪費しています。そして、それはスレッドプールスケジューラーを強化します。

于 2012-10-30T13:49:16.533 に答える
8

Backgroundworkerが実際に停止したことを確認するには、手動で強制終了します。セットyourBackgroundWorker.WorkerSupportsCancellation = true;。次に、Backgroundworkerを次のコマンドで停止します。

yourBackgroundWorker.CancelAsync();

それでもisBusy、の実行中/動作中のインスタンスを検出するには十分なはずBackgroundWorkerです。

于 2012-10-30T13:26:08.093 に答える
4

ドキュメントから:

true、BackgroundWorkerが非同期操作を実行している場合。それ以外の場合はfalse

ワーカースレッドをスリープ状態にするかどうかに関係なく、それでも何かを実行しているので、使用してIsBusyも問題ありません。

于 2012-10-30T13:11:39.963 に答える
0

ブール変数を作成し、backgroundworkerが実行を開始するたびに変数をtrueに設定し、backgroundworkerが終了した後にブール変数をfalseに設定します。ブール変数のステータスを確認してください。バックグラウンドワーカーがまだ実行されているか、正確に実行されていないことがわかります。

于 2020-02-12T03:36:15.460 に答える