启用面板导致WinForms应用程序输入“无响应”;模式

本文关键字:响应 无响应 模式 输入 应用程序 WinForms 启用 | 更新日期: 2023-09-27 18:07:41

我有一个非常类似于DataGridView刷新导致"无响应"应用程序的问题(但仅当不在Visual Studio中时)

当我将数据加载到我的Winforms应用程序表单时,我暂时禁用了填充表单并包含所有控件的面板,完成后我将其启用。

与示例中一样,我使用BackgroundWorker加载数据,并使用线程安全的bgWorkerSend_ProgressChangedbgWorkerSend_RunWorkerCompleted与UI交互。

我也有一个Windows窗体定时器,在5分钟空闲时间后以同样的方式刷新窗体。

奇怪的是,在init加载结束时,面板被正确地启用,而在后面的刷新中,应用程序进入"不响应"模式,并永远保持在那里。此外,这只会在我直接执行应用程序时发生。如果在Visual Studio中执行,它在初始加载和刷新时都能正常工作。

private void _bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    if (e.ProgressPercentage == 100)
    {
        // re-enable panel
        panel1.Enabled = true;
        // the below is never reached !!?
        AnyInstruction();
    }
}

启用面板导致WinForms应用程序输入“无响应”;模式

缩小问题范围,它表明问题是因为BackgroundWorker线程内部的代码填充了在主线程中较早实例化的DataSet

通过将实例化移动到BackgroundWorker线程中,解决了这个问题,panel1.Enabled = true;现在在_bw_ProgressChanged中正确执行。