【问题标题】:What is the correct way to close a second Application loop?关闭第二个应用程序循环的正确方法是什么?
【发布时间】:2012-10-18 23:22:02
【问题描述】:
    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();
    }

我正在尝试各种方法来关闭第二个消息循环中的表单。在这种情况下如何正确同步我的线程?另外,我需要拨打Application.Exit() 两次还是Form.Close() 是我能做的最好的?我看到 Application.Run() 使我的死线程保持活力。这是我的担心。假设主线程可以存活很长时间。

【问题讨论】:

    标签: c# winforms multithreading


    【解决方案1】:

    Form.Close() 将退出其他消息循环,只要将 Form 作为参数传递给 Application.Run(formOnOtherMessageLoop),就像您所做的那样。相反,如果您写了Application.Run() 并调用了Form.Close(),应用程序将不会退出。

    但是为什么你需要另一个消息循环呢?尤其是您这样做的方式,因为这将消耗一个线程池线程来运行所述其他消息循环。

    这几乎总是一个坏主意 - 这来自使用过使用多个消息循环实现的对延迟非常敏感的应用程序的人(通常很糟糕,有很多错误)。

    【讨论】:

    • 我有一个加载表单,显示在第二个线程中。如果 GIF 与 UI 在同一个线程上,它就不会旋转,因为 UI 会吐出一堆垃圾。所以你说的是我真的需要在启动第二个循环之前卸载 UI 中完成的工作,嗯?现在必须这样做,因为卸载 UI 是一项巨大的工作……许多控件是在超级复杂的逻辑中创建的。
    • 是的 - 在后台线程中完成 UI 线程陷入困境的艰苦工作,并根据需要使用 Invoke 和 BeginInvoke 来更新 UI 的状态(或者更好的是,使用 BackgroundWorker 类) .
    • 如果加载 UI 需要很长时间,您不能将其卸载到后台线程(与控件交互需要在 UI 线程上完成)。您应该考虑如何优化它。 WinForms 中的常见罪魁祸首是加载数据以绑定到下拉列表和网格等。我会考虑找一个分析器来看看需要这么长时间。
    • 是的,同意。这就是为什么我说这是一项艰巨的工作。我将完成以上所有工作......我只需要告诉用户“嘿,是的,我知道这段代码很糟糕而且速度很慢,所以请等待我们实际上正在做一些没有冻结的事情”......直到那时
    • 在这种情况下,您的原始计划可能是您能做的最好的。跨线程调用时不要忘记 Invoke 或 BeginInvoke,使用时要格外小心。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2012-03-23
    相关资源
    最近更新 更多