1

私が取り組んでいるアプリケーションには、いくつかのフォームがあります。1 つは 3D 画像を表示する目的で使用され、もう 1 つはそれを管理するために使用されます。画像の一部の変更には時間がかかります。その間、両方のフォームが再描画されません。

私が達成したいのは、少なくとも制御フォーム (かなり標準的なコンポーネントのみから構成されている) がユーザーとの対話を継続し、再描画され続けることです。私の見方では、現在使用しているスレッドがビジーであるため、別のスレッドに移動する必要があります。

どうすればいいですか?Application.Run(secondForm) で十分ですか?

4

2 に答える 2

2

面倒な作業は別のスレッドで行う必要があります。バックグラウンド ワーカーを使用して、作業を簡単にしたり、独自のスレッドを管理したりできます。

このようなもの:

  • コントローラーフォームがスタートを押す=>スレッド/バックグラウンドワーカーを開始し、その中で計算を行います
  • 計算が完了したら、イメージ フォームを更新します。完了したらイベントを呼び出して、イメージ/コントローラー フォームにサブスクライブさせることができます。
  • または、計算が完了する前にコントローラ フォームが何かを変更した場合は、バックグラウンド ワーカーをキャンセルして、最初からやり直すことができます。
于 2012-12-07T12:18:53.307 に答える
0

Carraが提案したように、通常は重い物をBackgroundWorkerにオフロードするのが最善です。

しかし、あなたの質問に直接答えるために、はい、あなたはフォームを別のスレッドに入れることができます。この場合、バックグラウンドウィンドウがまだ多くの時間応答しないため、理想的ではない可能性があります。しかし、それは可能です。

ほとんどのUIはシングルスレッドを必要とするため、手動で作成されたスレッド(たとえば、タスクThreadPoolスレッドではなく)を使用し、スレッドを開始する前に必ずThread.SetApartmentState (ApartmentState.STA)を呼び出す必要があります。アパート。次に、そのスレッド内にフォームを作成し、Application.RunまたはForm.ShowDialogを呼び出すことができます。

もちろん、すべての通常のスレッド制限が適用されます(フォームとそのコントロールにアクセスできるのは、それらを作成したスレッドからのみです)。

于 2012-12-07T12:49:23.167 に答える