次の問題があります。
スレッドの実行が終了したかどうか、つまりスレッドメソッドが返されたかどうかを確認したい(C#)。私が今やっていることはThread.Join(1)
を呼び出すことですが、これにより1ミリ秒の遅延が生じます。スレッドが終了したかどうかを簡単に確認する方法はありますか。検査Thread.ThreadState
ただ面倒すぎるようです。
使用 - Thread.IsAlive
フラグ。これは、スレッドのステータスを提供するためです。
スレッドが終了すると、スレッドからイベントを発生させ、サブスクライブすることができます。
または、引数なしで Thread.Join()
を呼び出すこともできます。
スレッドが終了するまで呼び出しスレッドをブロックし、標準のCOMおよびSendMessageポンピングを実行し続けます。
標準のCOMおよびSendMessageポンピングの実行を継続しながら、スレッドが終了するか、指定された時間が経過するまで呼び出しスレッドをブロックします。
この場合、指定された時間は1ミリ秒です。
スレッドの場合、myThread.IsAlive
プロパティ。スレッドメソッドが返された場合、またはスレッドが中止された場合はfalseです。
Thread.Join(TimeSpan.Zero)
を使用します。呼び出し元をブロックせず、スレッドが作業を完了したかどうかを示す値を返します。ところで、それはすべてのWaitHandle
クラスもテストする標準的な方法です。
実行中の他のスレッドの完了を待機/確認することで現在のスレッドをブロックしたくない場合は、このようなコールバックメソッドを実装できます。
Action onCompleted = () =>
{
//On complete action
};
var thread = new Thread(
() =>
{
try
{
// Do your work
}
finally
{
onCompleted();
}
});
thread.Start();
クロススレッド操作をサポートしていないコントロールを扱っている場合は、コールバックメソッドを呼び出す必要があります
this.Invoke(onCompleted);
BackgroundWorker Class を見て、 On RunWorkerCompleted でそれを行うことができます。
現在の(呼び出し元のスレッドの)実行をブロックする場合を除き、IsAliveを広範囲に使用します。その場合、パラメーターなしでJoin()を呼び出すだけです。ターゲットスレッドが実際に何らかの理由でまだ実行を開始していない場合、IsAliveはfalseを返す場合があることに注意してください。
カルロス・メリグ。
使用方法によって異なります。結合の使用は1つの方法です。それを行う別の方法は、イベントを使用して、スレッドが呼び出し元にスレッドを通知できるようにすることです。たとえば、しばらくの間実行され、終了時にGUIを更新する必要があるプロセスを呼び出すグラフィカルユーザーインターフェイス(GUI)スレッドがある場合、イベントを使用してこれを行うことができます。このWebサイトでは、イベントの操作方法に関するアイデアを提供します。
http://msdn.Microsoft.com/en-us/library/aa645739%28VS.71%29.aspx
クロススレッド操作が発生することを忘れないでください。別のスレッドからGUIを更新する場合は、更新するコントロールのInvoke
メソッドを使用する必要があります。