1

フォームをインスタンス化し、BeginInvoke 内から ShowDialog を呼び出しても安全ですか?

BeginInvoke は、コントロールが作成されたのと同じスレッドでタスクを実行します。だから私が知る限り、大丈夫なはずです...

そのような作成がハングやデッドロックなどにつながる可能性があるかどうかを尋ねている.

4

2 に答える 2

2

これはあいまいです。最初にフォームをインスタンス化してから BeginInvoke() を呼び出すように聞こえます。いいえ、それ大丈夫ではありません。ShowDialog() がメッセージ ループをポンピングするため、動作するように見えます。しかし、非常に厄介なグリッチがたくさんあります。軽度の問題は、ウィンドウがアプリ内の他のウィンドウに対してモーダルではないことです。また、アプリ内の他のウィンドウとの Z オーダーの関係がないため、別のウィンドウの背後に簡単に隠れてしまう可能性があります。厄介なことは、スレッドがおそらく STA スレッドではないことです。ドラッグ アンド ドロップ、クリップボード、シェル ダイアログなどは機能しません。本当に_厄介なことは、SystemEvents クラスが間違ったスレッドでイベントの発生を開始することです。この問題は、ダイアログを過ぎても続き、後で予測できない時間にアプリがクラッシュまたはハングします。

UI スレッドでのみフォーム インスタンスを作成します。つまり、以前に作成されたフォームの別のインスタンスのBeginInvoke() メソッドを使用する必要があります。どうしても見つけたい場合は、 Application.OpenForms[0] を使用してください。

于 2013-08-05T12:52:26.130 に答える
-1

BeginInvoke 内で ShowDialog を呼び出しても安全ですか? バックグラウンド スレッドから ShowDialog を呼び出すと問題が発生します。

于 2013-08-05T12:14:06.683 に答える