44

次の問題があります:

スレッドが実行を終了したかどうか、つまりスレッド メソッドが返されたかどうかをチェック (C#) したい。私が今行っているのは callThread.Join(1)ですが、これにより 1 ミリ秒の遅延が発生します。スレッドが終了したかどうかを簡単に確認する方法はありますか。調べるThread.ThreadStateだけでも面倒そうです。

4

8 に答える 8

73

Thread.IsAliveフラグを使用します。これは、スレッドのステータスを与えるためのものです。

于 2010-05-05T14:43:46.217 に答える
15

スレッドの場合、myThread.IsAliveプロパティがあります。スレッドメソッドが返された場合、またはスレッドが中止された場合はfalseです。

于 2010-05-05T13:19:00.353 に答える
11

スレッドが終了したときにスレッドからイベントを発生させ、それをサブスクライブすることができます。

Thread.Join()または、引数なしで呼び出すこともできます。

標準のCOMおよびSendMessageポンピングを実行し続けながら、スレッドが終了するまで呼び出し元のスレッドをブロックします。

Thread.Join(1)意思:

標準のCOMおよびSendMessageポンピングを実行し続けながら、スレッドが終了するか、指定された時間が経過するまで、呼び出し元のスレッドをブロックします。

この場合、指定された時間は1ミリ秒です。

于 2010-05-05T13:18:14.393 に答える
9

使用Thread.Join(TimeSpan.Zero) 呼び出し元をブロックせず、スレッドが作業を完了したかどうかを示す値を返します。ちなみに、これはすべてのWaitHandleクラスをテストする標準的な方法でもあります。

于 2010-05-05T13:25:26.550 に答える
2

(呼び出しスレッドの) 現在の実行をブロックしたい場合を除いて、IsAlive を広範囲に使用します。その場合は、パラメータなしで Join() を呼び出します。ここで、何らかの理由でターゲット スレッドがまだ実際に実行を開始していない場合、IsAlive は false を返す可能性があることに注意してください。

カルロス・メリヘ。

于 2012-08-23T22:06:25.480 に答える
1

BackgroundWorker Classを見てください。 OnRunWorkerCompletedを使用すると、それを行うことができます。

于 2013-03-30T10:46:46.920 に答える
0

それはあなたがそれをどのように使いたいかによって異なります。Join を使用するのも 1 つの方法です。これを行う別の方法は、イベントを使用して、スレッドがスレッドの呼び出し元に通知できるようにすることです。たとえば、しばらく実行され、終了時に GUI を更新する必要があるプロセスを呼び出すグラフィカル ユーザー インターフェイス (GUI) スレッドがある場合、イベントを使用してこれを行うことができます。この Web サイトでは、イベントを操作する方法についてのアイデアが得られます。

http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx

クロススレッド操作が発生することに注意してください。別のスレッドから GUI を更新する場合は、更新するInvokeコントロールのメソッドを使用する必要があります。

于 2010-05-05T13:23:47.447 に答える