次の問題があります:
スレッドが実行を終了したかどうか、つまりスレッド メソッドが返されたかどうかをチェック (C#) したい。私が今行っているのは callThread.Join(1)
ですが、これにより 1 ミリ秒の遅延が発生します。スレッドが終了したかどうかを簡単に確認する方法はありますか。調べるThread.ThreadState
だけでも面倒そうです。
次の問題があります:
スレッドが実行を終了したかどうか、つまりスレッド メソッドが返されたかどうかをチェック (C#) したい。私が今行っているのは callThread.Join(1)
ですが、これにより 1 ミリ秒の遅延が発生します。スレッドが終了したかどうかを簡単に確認する方法はありますか。調べるThread.ThreadState
だけでも面倒そうです。
Thread.IsAlive
フラグを使用します。これは、スレッドのステータスを与えるためのものです。
スレッドの場合、myThread.IsAlive
プロパティがあります。スレッドメソッドが返された場合、またはスレッドが中止された場合はfalseです。
スレッドが終了したときにスレッドからイベントを発生させ、それをサブスクライブすることができます。
Thread.Join()
または、引数なしで呼び出すこともできます。
標準のCOMおよびSendMessageポンピングを実行し続けながら、スレッドが終了するまで呼び出し元のスレッドをブロックします。
標準のCOMおよびSendMessageポンピングを実行し続けながら、スレッドが終了するか、指定された時間が経過するまで、呼び出し元のスレッドをブロックします。
この場合、指定された時間は1ミリ秒です。
使用Thread.Join(TimeSpan.Zero)
呼び出し元をブロックせず、スレッドが作業を完了したかどうかを示す値を返します。ちなみに、これはすべてのWaitHandle
クラスをテストする標準的な方法でもあります。
(呼び出しスレッドの) 現在の実行をブロックしたい場合を除いて、IsAlive を広範囲に使用します。その場合は、パラメータなしで Join() を呼び出します。ここで、何らかの理由でターゲット スレッドがまだ実際に実行を開始していない場合、IsAlive は false を返す可能性があることに注意してください。
カルロス・メリヘ。
BackgroundWorker Classを見てください。 OnRunWorkerCompletedを使用すると、それを行うことができます。
それはあなたがそれをどのように使いたいかによって異なります。Join を使用するのも 1 つの方法です。これを行う別の方法は、イベントを使用して、スレッドがスレッドの呼び出し元に通知できるようにすることです。たとえば、しばらく実行され、終了時に GUI を更新する必要があるプロセスを呼び出すグラフィカル ユーザー インターフェイス (GUI) スレッドがある場合、イベントを使用してこれを行うことができます。この Web サイトでは、イベントを操作する方法についてのアイデアが得られます。
http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx
クロススレッド操作が発生することに注意してください。別のスレッドから GUI を更新する場合は、更新するInvoke
コントロールのメソッドを使用する必要があります。