8

Winformsを使用して、「メイン」UIスレッドではないスレッドを使用している場合、安全にできますか

  1. フォームを作成し、
  2. そのフォームで ShowDialog を呼び出す

私は次のルールに従っているようです: Winforms コントロールは、それらが作成されたスレッドで変更する必要があります。

私が行ったいくつかの読書から、ShowDialog は独自のメッセージ ポンプを作成するように思われるため、既にメッセージ ポンプがあるスレッドでフォームが作成されることを心配する必要はありません。

質問の背景は、いくつかの Winforms UI を表示したいコールバックを取得することですが、メイン スレッドへの呼び出しに使用できる他の UI にはアクセスできません。

4

2 に答える 2

7

スレッドの SetApartmentState() メソッドを呼び出してスレッドを STA に切り替えることが非常に重要ですが、これはおおむね正しいです。クリップボード、ドラッグ アンド ドロップ、シェル ダイアログなど、多くの UI 操作で重要です。また、スレッドで作成したフォームがフォアグラウンドになく、別のウィンドウの後ろに隠れている場合、Z オーダーの問題がよく発生します。または、ユーザーが予期しないときに実際にフォアグラウンドで移動し、予期せずマウス クリックまたはキーストロークを取得するという厄介な習慣があります。

これらは修正が難しい問題であり、アプリを不安定にします。呼び出し先の参照を持たない正当な理由はありません。何らかの方法でそれをクラスに渡すこともできます。本当に必要な場合は、いつでも Application.OpenForms[0] に頼ることができます。

于 2012-06-06T00:03:08.467 に答える
2

はい、それを行うことができますが、ダイアログを実際にモーダル ダイアログのように動作させたい場合 (つまり、 を呼び出しているため、必要だと思われる親 Window をブロックする場合ShowDialog)、がっかりすることを覚悟してください。

ここで実際に解決しようとしている問題は何ですか。ブロックしないモーダル ダイアログが必要なようですが、これは少し奇妙です。目の前の問題を説明すると、まだ考えていない解決策が存在する可能性があります。

于 2012-06-05T22:51:43.477 に答える