You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Winforms加载新窗体时UI冻结:异步定时器关闭其他窗体后新开LoginScreen无响应

问题根源

你的代码核心问题是新的LoginScreen窗体在非UI线程中被创建和显示,WinForm 规定所有UI控件的创建、属性修改、显示操作都必须在主UI线程(程序启动时的主线程)上执行,否则会出现消息循环异常、界面冻结、无响应等问题。

你使用的System.Timers.Timer的Elapsed事件默认在线程池工作线程上触发:

  • 关闭窗体的逻辑你做了InvokeRequired判断和跨线程封送处理,所以可以正常执行
  • 但创建、显示LoginScreen的逻辑直接在后台线程执行,没有做线程切换,导致窗体绑定到后台线程的消息队列,和主UI线程消息循环脱离,最终出现冻结。

解决方案(三选一即可)

方案1:给System.Timers.Timer指定同步对象

给定时器绑定当前BaseWindow作为同步上下文,让Elapsed事件自动在UI线程触发,无需额外修改其他逻辑:

public BaseWindow()
{
    InitializeComponent();
    var login = new LoginScreen();
    login.Show();
    var theTimer = new System.Timers.Timer(5000);
    theTimer.SynchronizingObject = this; // 新增这行,指定同步上下文为当前UI窗体
    theTimer.Elapsed += PollUpdates;
    theTimer.Start();
}

方案2:创建登录窗体时手动封送到UI线程

在创建LoginScreen的位置判断线程上下文,手动切到UI线程执行:

private void PollUpdates(object sender, EventArgs e)
{
    if (Program.Globalsession.SessionId != default(Guid))
    {
        if (DateTime.Compare(Program.Globalsession.ValidTo, DateTime.Now) < 0)
        {
            CloseAllForms();
            // 新增线程判断,将窗体创建逻辑封送到UI线程执行
            if (this.InvokeRequired)
            {
                this.Invoke(new Action(() => 
                {
                    var login = new LoginScreen();
                    login.Show();
                }));
            }
            else
            {
                var login = new LoginScreen();
                login.Show();
            }
        }
    }
}

方案3:替换为WinForm原生UI定时器(最推荐)

System.Windows.Forms.Timer是专为UI场景设计的定时器,Tick事件天生在UI线程触发,完全不需要处理跨线程问题:

// 先在BaseWindow类中定义窗体级别的UI定时器
private System.Windows.Forms.Timer uiTimer;

public BaseWindow()
{
    InitializeComponent();
    var login = new LoginScreen();
    login.Show();
    // 替换原有Timers.Timer的初始化逻辑
    uiTimer = new System.Windows.Forms.Timer();
    uiTimer.Interval = 5000;
    uiTimer.Tick += PollUpdates;
    uiTimer.Start();
}

内容的提问来源于stack exchange,提问作者patru marian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 17:39:00