2017-05-25 12 views
1

私はこのような質問をたくさん見ましたが、私は異常に遭遇し続けます。私はいくつかのフォームを初期化しようとしています。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で使用しています。

+2

少なくとも、Monoでも、フォームはネイティブウィンドウが作成されるまで、特定のスレッドにコミットされません。それが起きるまで、Invoke()はあなたが望むことをしません。ネイティブウィンドウは可能な限り遅く作成されるため、Show()が必要です。 'this.CreateHandle();'をフォームコンストラクタに追加すると、強制的にフォームコンストラクタを早期に終了させることができます。 –

+0

問題を解決したので、答えとして書く必要があります。ありがとう! –

答えて

1

Hans's commentは正確ですが、IMHOは間違った経路を導きます。ハンドルがまだ作成されていないため、SubFormオブジェクトを使用して正しいスレッドに戻すことはできません。しかし、にはに有効なハンドルがある別のオブジェクトがあります:MainFormオブジェクトです。

さらに、Form.Shownイベントを使用して、MainFormが表示されている(特に有効なハンドルがある)までコードが実行されないようにすることができます。

最後に、新しいasync/awaitというパラダイムを活用すれば、明示的な呼び出しを完全に避けることができます。フレームワークはあなたのためにそれを行います。上記で、イベントハンドラの匿名メソッドを使用して、あなたもMainFormの静的フィールドを必要としないことを

public static void Main() { 
    MainForm = new DebugUserInterface(); // just a dummy form 
    SubForm = new DebugUserInterface(); // ditto 

    MainForm.Shown += async (sender, e) => 
    { 
     await Task.Run(DoWork); 
     SubForm.Show(); 
    }; 

    Application.Run(MainForm); // start the message pump 
} 

private static void DoWork() { 
    Thread.Sleep(1000); // pretend to do some work 
} 

注:それはこのようになりますすべて一緒に、と

入れ変数はSubFormです。必要に応じて、それらのローカル変数を作成することができます。

関連する問題