ユーザーが指定した検索条件に一致するファイルの特定のリストを表示する簡単な GUI プログラムを作成しています。
検索に時間がかかる場合があります (10 ~ 15 秒)。そこで、新しいスレッドで Search 関数を呼び出しました。また、関数には、新しく作成されたスレッドが中止された後にのみ実行できるコードがいくつかあります。したがって、Join() 関数を使用して、スレッドが終了するまでプログラムの実行をブロックしました。ただし、これを使用すると、アプリケーションがハングします。この問題の解決策を教えてください。
質問する
75 次
2 に答える
4
于 2013-10-28T20:25:54.813 に答える
3
UI スレッドが新しいスレッドの終了を待機しているため、UI がハングします。基本的に、UI スレッドで直接検索を実行した場合と同じ問題が発生します。
解決策: 新しいスレッドを待たないでください。スレッドが完了したら UI に対して何かを行うために、Control.Invoke を使用してそのスレッドから UI コードにコールバックできます。たとえば、フォームが呼び出された場合m_myForm
、バックグラウンド スレッドでこれを実行して、UI スレッドでフォームの関数を呼び出し、結果を渡すことができます。
m_myForm.Invoke((Action)() => m_myForm.DoSomethingWithSearchResult(result));
または、 Thread を直接使用する代わりに、 BackgroundWorkerを使用できます。これは、非 UI スレッドで何かを実行するのに役立ち、作業が完了したときにイベントを発生させ、UI とバックグラウンド作業の間で正しく同期するようにします。
于 2013-10-28T20:26:51.283 に答える