Winforms UI 加载新的时冻结

Winforms UI freezes when loading a new from

我正在尝试制作一个异步计时器,它将关闭所有打开的表单(以线程安全的方式)(BaseWindow 除外)并打开一个新的 LoginScreen 表单。目前所有表格都在关闭,但是当新的 LoginScreen 表格开始时,它 UI 被冻结。

代码如下所示:

    {
        public static Form[] OpenForms
        {
            get
            {
                Form[] forms = null;
                int count = Application.OpenForms.Count;
                forms = new Form[count];
                if (count > 0)
                {
                    int index = 0;
                    foreach (Form form in Application.OpenForms)
                    {
                        forms[index++] = form;
                    }
                }
                return forms;
            }
        }


        delegate void CloseMethod(Form form);
        static private void CloseForm(Form form)
        {
            if (!form.IsDisposed)
            {
                if (form.InvokeRequired)
                {
                    CloseMethod method = new CloseMethod(CloseForm);
                    form.Invoke(method, new object[] { form });
                }
                else
                {
                    form.Close();
                }
            }
        }
        static public void CloseAllForms()
        {
            // get array because collection changes as we close forms
            Form[] forms = OpenForms;
            // close every open form
            foreach (Form form in forms)
            {
                if (form.GetType() != typeof(BaseWindow))
                {
                    CloseForm(form);
                }
            }          
        }
        private void PollUpdates(object sender, EventArgs e)
        {
            ;
            if (Program.Globalsession.SessionId != default(Guid))
            {
                if (DateTime.Compare(Program.Globalsession.ValidTo, DateTime.Now) < 0)
                {
                    CloseAllForms();
                    var login = new LoginScreen();
                    login.Show();
                }
            }

        }     
        public BaseWindow()
        {
            InitializeComponent();
            var login = new LoginScreen();
            login.Show();
            var theTimer = new System.Timers.Timer(5000);
            theTimer.Elapsed += PollUpdates;
            theTimer.Start();
        }
    }

知道我做错了什么吗?

我猜你使用了错误的计时器类型。使用 System.Windows.Forms.Timer(而不是 System.Timers.Timer)。详情 .

因此您正在 UI 线程以外的线程上创建 LoginScreen