私はこのような質問をたくさん見ましたが、私は異常に遭遇し続けます。私はいくつかのフォームを初期化しようとしています。Application.Run(...)
をメインフォームと呼びます。非メインフォームを表示せずに、いくつかの作業を行い、残りのフォームを動的に表示/非表示にします。いくつかのダミーコードが続きます。Application.Run()の後にフォームを表示
public static void Main() {
MainForm = new DebugUserInterface(); // just a dummy form
SubForm = new DebugUserInterface(); // ditto
Task.Run((Action) DoWork); // schedule some work on another thread
Application.Run(MainForm); // start the message pump
}
private static void DoWork() {
Thread.Sleep(1000); // pretend to do some work
SubForm.Invoke((Action) SubForm.Show); // show the other form
// should occur after the message pump has started
}
サブフォームは決して表示されません。興味深いことに、サブフォームはメッセージポンプを起動する前にSubForm.Show()
を呼び出すだけで正しく表示され、正しく動作しますが、特定のフォームを非表示にしたり、初期化したり、存在しないようにしたい(実行時にフォームを作成したい場合) Application.Run(...)
に電話する前に
私はこのコードをコンパイルし、macOS(MonoランタイムとWineを使用)とWindows(.NETランタイムを使用)の両方でコードを実行して、macOSをMono 5.0.0.100で使用しています。
少なくとも、Monoでも、フォームはネイティブウィンドウが作成されるまで、特定のスレッドにコミットされません。それが起きるまで、Invoke()はあなたが望むことをしません。ネイティブウィンドウは可能な限り遅く作成されるため、Show()が必要です。 'this.CreateHandle();'をフォームコンストラクタに追加すると、強制的にフォームコンストラクタを早期に終了させることができます。 –
問題を解決したので、答えとして書く必要があります。ありがとう! –