启用面板导致WinForms应用程序输入“无响应”;模式
本文关键字:响应 无响应 模式 输入 应用程序 WinForms 启用 | 更新日期: 2023-09-27 18:07:41
我有一个非常类似于DataGridView刷新导致"无响应"应用程序的问题(但仅当不在Visual Studio中时)
当我将数据加载到我的Winforms应用程序表单时,我暂时禁用了填充表单并包含所有控件的面板,完成后我将其启用。
与示例中一样,我使用BackgroundWorker
加载数据,并使用线程安全的bgWorkerSend_ProgressChanged
或bgWorkerSend_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();
}
}
缩小问题范围,它表明问题是因为BackgroundWorker
线程内部的代码填充了在主线程中较早实例化的DataSet
。
通过将实例化移动到BackgroundWorker线程中,解决了这个问题,panel1.Enabled = true;
现在在_bw_ProgressChanged
中正确执行。