none
Winform项目,在 Main 函数中 Application.Run方法之前show一个窗体1,然后新建一个线程使用委托更新窗体1,但是线程还是卡在主线程中 RRS feed

  • 问题

  •     static class Program
        {
            /// <summary>
            /// 应用程序的主入口点。
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                
                FrmWaiting2 frmWaiting2 = new FrmWaiting2();
                frmWaiting2.BringToFront();
                frmWaiting2.Show();
                Thread thread = new Thread(ThreadMethod);
                thread.Name = "子线程更新进度条";
                thread.Start(frmWaiting2);
    
                // 执行耗时操作
    
                Application.Run(new Form1());
            }
    
            public static void ThreadMethod(object parameter) 
            {
                if (parameter is FrmWaiting2)
                {
                    FrmWaiting2 fw2 = (FrmWaiting2) parameter;
                    for (int i = 0; i < 10000; i++)
                    {
                        Console.WriteLine("{0}开始执行。", i);
                        lock (fw2)
                        {
                            fw2.UpdataUIStatus(i); // invoke方法更新界面
                        }
                        Thread.Sleep(500);
                    }
                }
            }
        }
    
    


    我使用了各种多线程异步更新UI(进度及状态信息)的方法都不行,但是在Application.Run(new Form1())方法之后,Form1中线程异步更新可以,这是为什么?是否跟 static void Main() 上面的  [STAThread],有关,还是跟 Application.Run(xx)有关,如果有关,能帮我解答一下具体时怎么回事吗?很困惑~~谢谢了!!

            

    2019年6月3日 3:22

全部回复

  • Hi,

    当你想指定启动窗口的时候,你可以在该窗口类中声明一个Main()方法,并为这个方法设置[STAThread]属性。详情你可以参考一下官方文档:Mark Windows Forms entry points with STAThread

    当调用Application.Run()时,它将控制转移到Winforms主消息循环。您要执行的任何其他代码应该在单独的线程中运行,或者在类似于Form_Load中的事件方法中运行。并不建议在Application.Run()之前进行任何操作。

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年6月3日 5:29
    版主
  • 谢谢你的回答,我知道不建议这样做。但是我现在不明白的是放在 Application.Run() 之前为什么不行呢
    2019年6月3日 6:11
  • Hi,

    这可能与消息机制有关,有关消息你可以参考一下以下文章:

    WinForm二三事(一)消息循环

    Regards,

    Kyle


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2019年6月4日 9:56
    版主