2012-10-30 4 views
5

私はBackgroundWorkerのスレッドが生きていることを確認する方法を把握しようとしています(つまり、まだ実行中のスレッドは、本質的には、単純な無限ループとして実装されます。BackgroundWorkerのIsBusyは "IsAlive"と同じですか?

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

IsAlive()に最も近いものは、私がこれまでに見つかりましたIsBusyプロパティがありますが、時間の私のスレッドスリープ()のほとんどは、私はこれが仕事をするかどうかを確認していないことを考えると

は私がやってIsBusyに数えることができます:。

if (!myWorker.IsBusy) 
    RestartWorker(); 

または私はトラブルを呼びかけていますか? docsから

+1

isBusyがfalseの場合、Backgroundworkerは仕事をしていないので、表示されたコードを使用することで問題にはなりません。 "RestartWorker()"メソッドは、ワーカーが開始されていないため、間違っています。しかし、それはプログラミング上の問題よりも言語のことです。 – jAC

+2

スレッド内にコードを実装して、それ自体を再起動すると問題が発生することがあります。あなたは失敗状態を検出し、スレッドを終了し、まったく新しいスレッドを再起動する方が良いでしょう。そうしないと、デッドロック状態になる可能性が非常に高くなります。 –

答えて

12

BackgroundWorker.IsBusyは、DoWorkイベントハンドラがビジー状態である限り、trueです。および RunWorkerCompletedイベントハンドラはまだ実行されていません。後者の節に注意してください。プロパティはではありません。はループがアクティブかどうかを教えてくれます。

さらに、2番目のスニペットにはかなり不快な競合状態があります。 IsBusyはif()ステートメントでは真であるかもしれませんが、ナノ秒後にはfalseになります。 1ヶ月に1回ストライクするレースの種類。コードの目的は、スニペットから推測するのが難しく、回避策を提供することが難しいからです。競合することのない新しいBGWオブジェクトを作成することを検討してください。また、そのループを取り除くのに役立ちます.10秒間スリープしているスレッドは、何もしないと非常に高価なシステムリソースを浪費しています。そして、スレッドプールスケジューラをガムアップする。

4

、BackgroundWorkerのは、非同期操作を実行している場合。それ以外の場合はfalseです。あなたはワーカースレッドをスリープ状態かどう

はかかわらず、それはまだIsBusyは問題ないはず使用してそう何かをやっています。

5

Backgroundworkerが本当に停止していることを確認するには、手動で強制終了することができます。 セットyourBackgroundWorker.WorkerSupportsCancellation = true;。あなたのBackgroundWorkerのランニング/作業インスタンスを検出するのに十分であるべき

yourBackgroundWorker.CancelAsync(); 

それでもisBusy: はその後、単純にBackgroundWorkerのを止めます。

関連する問題