Delegate.BeginInvokeを使用すると、非同期スレッドのステータスを取得するためにデリゲートを問い合わせるにはどうすればよいですか?私が本当に興味を持っているのは、スレッドが実行を完了したかどうかを判断することです。ありがとうございました。デリゲートスレッドのステータスを取得する
私が避けたいのは、新しいスレッドを作成したスレッドをブロックしなければならないことです。なぜなら、これらのスレッドが完了するまでの時間は気にしないからです。
Delegate.BeginInvokeを使用すると、非同期スレッドのステータスを取得するためにデリゲートを問い合わせるにはどうすればよいですか?私が本当に興味を持っているのは、スレッドが実行を完了したかどうかを判断することです。ありがとうございました。デリゲートスレッドのステータスを取得する
私が避けたいのは、新しいスレッドを作成したスレッドをブロックしなければならないことです。なぜなら、これらのスレッドが完了するまでの時間は気にしないからです。
これにはIAsyncResult.IsCompletedを使用できます。
これは非同期スレッドが完了するまでスレッドをブロックするスレッドをブロックする必要はありませんか? – Achilles
いいえ、メインスレッドからIAsyncResultを使用する必要はありません。いくつかの長期実行操作を非同期で開始することができます。たとえば、タイマーと別のスレッドを作成します。このスレッドは、この操作状態をポーリングしてUIの進捗状況を表示します。あるいは、いくつかの非同期操作を並行して実行し、それらのすべてが終了するのを待つ。 –
メインスレッドから非同期操作を呼び出す際に問題はありません。単に 'IAsyncResult.IsComplete'プロパティを使ってポーリングしている限り、あなたのメインスレッド(または呼び出しスレッド)は待たずに続行できるはずです。私はあなたのコードは最終的にブロックコールである 'IAsyncResult.EndInvoke'を呼び出すべきだと考えていますが、' IAsyncResult.IsComplete'がtrueを返した後でのみ呼び出すことができます。 –
これは、Delegate.EndInvokeを呼び出すことに関してother questionとうまく関連しています。あなたがそれをした場合、スレッドが完了したときを知ることができます。ステータスをチェックするだけでメインスレッドをブロックする必要はありません。
タスクが実行する*スレッド*の状態を調べることは、それほど有用ではありません。 'Delegate.BeginInvoke'はスレッドプールを使用します。そのため、デリゲートが実行するスレッドは、処理が完了した後に他の処理を実行する可能性があります。おそらく*タスク*の状態に興味があります。 – Ani