首页 > 解决方案 > Winforms UI 在加载新的时冻结

问题描述

我正在尝试制作一个异步计时器,它将关闭所有打开的表单(以线程安全的方式)(除了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();
        }
    }

知道我在做什么错吗?

标签: c#winforms

解决方案


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

因此,您是LoginScreen在 UI 线程以外的线程上创建的。


推荐阅读