0
    public static void Main()
    {
        Form formOnThisMessageLoop = new Form();
        formOnThisMessageLoop.Show();

        Form formOnOtherMessageLoop = new Form();

        Task.Factory.StartNew(
            () =>
            {                                        
                Application.Run(formOnOtherMessageLoop);                    
            }
         );
        //Thread.Sleep(50);
        formOnOtherMessageLoop.HandleCreated += (obj, args) =>
        formOnOtherMessageLoop.Invoke(new Action(() => { formOnOtherMessageLoop.Close(); })); //Value Close() cannot be called while doing CreateHandle().
        Application.Run();                         

        Console.Read();
    }

2 番目のメッセージ ループでフォームを閉じるさまざまな方法を試しています。このような場合、スレッドを正しく同期するにはどうすればよいですか? また、2回呼び出す必要がありますApplication.Exit()か、それとも Form.Close() が最善ですか? Application.Run() がデッド スレッドを維持していることがわかります。それが私の懸念です。メインスレッドが長く存続できると仮定します。

4

1 に答える 1

2

Form.Close()フォームがパラメーターとして渡されている限り、他のメッセージループを終了しますApplication.Run(formOnOtherMessageLoop)。代わりに、作成Application.Run()して呼び出しForm.Close()た場合、アプリケーションは終了しません。

しかし、なぜ別のメッセージ ループが必要なのでしょうか? 特に、他のメッセージループを実行するためにスレッドプールスレッドを消費するため、あなたがやっている方法です。

これは、ほとんどの場合、悪い考えです。これは、複数のメッセージ ループを使用して実装された (通常は貧弱で、多くのバグがある) 非常に遅延の影響を受けやすいアプリケーションで作業したことのある人から来ています。

于 2012-10-18T23:30:15.503 に答える