2

私はさまざまなフォーラム、チュートリアル、またはSOで、UIを別のスレッドで実行し、プログラムの残りの部分で実行して応答性を維持するという推奨事項に答えています。
これは実際にはどのように行われますか?program.csフォームをロードする前にスレッドを開始するように編集することを意味しますか?それとも、フォーム内からアクティブ化された重要な操作がスレッドをフォークしてそれを使用することを意味しますか?それともいくつかの設定ですか?どのようにそれを扱いますか?

4

4 に答える 4

4

UIの応答性を維持するには、別のスレッドで他の時間のかかる操作を実行する必要があります。通常、ユーザーインターフェイスの操作は、.NETのメイン(UI)スレッドで実行する必要があります。

操作に別の(バックグラウンド)スレッドを使用する方法はいくつかあります。Windowsフォームアプリケーションの場合、最も単純なオプションはBackgroundWorkerコンポーネントです。

Thread自分でオブジェクトを作成することもできます。ただし、作成されたスレッドでUIメソッドを呼び出したりUIコントロールのプロパティを変更したりする場合は注意が必要です。私が言ったように、すべてのユーザーインターフェイス操作(フォームの表示、コントロールのテキストや場所の変更など)はUIスレッドで実行する必要があります。そうしないと、例外が発生します。これを行うには、メソッドを使用できますControl.Invoke

于 2012-11-18T09:36:05.717 に答える
2

通常、C#WinFormsアプリケーションでは、Program.csはそのようにメインフォームを起動します。

Application.Run(new MyMainForm());

これにより、すべてのイベントが発生するメインのディスパッチャー(GUI)スレッドが作成されます(ボタンのクリック、フォームの読み込みなど)。実際には、長い計算を実行する必要がある場合は、新しいバックグラウンドワーカースレッドを作成し、それを使用します。 UIの更新が終了したら、イベントディスパッチャに呼び出します。

UIスレッドで長いプロセスを実行すると、UIがロックされ、応答しなくなります。

于 2012-11-18T09:32:33.503 に答える
1

UIはメインスレッドで実行されます。アイデアは、新しいスレッドで長い操作を実行することです。独自のスレッドですべての重要な操作を実行しないでください。ただし、フォームが「応答しない」状態になる原因はすべて、スレッドの適切な候補です。

C#BackgroundWorkerでは、独自のスレッドをロールする代わりに使用するのがおそらく最も簡単です。

于 2012-11-18T09:34:45.327 に答える
0

チュートリアルまたはSOは、UIを別のスレッドで実行するという推奨事項に答えます...私はそれを疑っています。とにかく、UIは独自のスレッドで実行されます。アプリケーションの「メイン」スレッドと呼ばれることもあります。アプリのフリーズを回避するには、他のスレッドでCPUを集中的に使用します。これを行う方法はたくさんあります。スレッド、タスク、非同期、およびおよびをチェックしてください。Framework 4.5を使用している場合await SomeTaskは、タスクを完了するのに20〜50ミリ秒以上かかる可能性がある場合はいつでも、この機能を使用できます。少なくとも、これはMS担当者からの推奨事項です(afaik)

于 2012-11-18T09:39:00.273 に答える