启用面板会导致 WinForms 应用程序进入 "Not Responding " 模式
Enabling panel causes WinForms application to enter "Not Responding " mode
我遇到的问题与 DataGridView refresh causes "Not Responding" application (but only when not in Visual Studio)
非常相似
在将我的数据加载到我的 Winforms 应用程序表单时,我临时禁用了一个面板来填充表单并包含所有控件,并在完成后重新启用它。
如示例中所示,我使用 BackgroundWorker
加载数据并使用线程安全 bgWorkerSend_ProgressChanged
或 bgWorkerSend_RunWorkerCompleted
与 UI.[=16 交互=]
我还有一个 Windows 表单计时器,它会在闲置 5 分钟后以相同的方式刷新表单。
奇怪的是,在初始化加载结束时,面板被正确启用,而在后面的刷新中,应用程序进入 "Not Responding" 模式,并永远保持在那里。此外,这仅在我直接执行应用程序时才会发生。如果从 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
,该 DataSet
已在主线程中较早实例化。
通过将实例化转移到 BackgroundWorker 线程中,问题得到解决,panel1.Enabled = true;
现在可以在 _bw_ProgressChanged
中正确执行。
我遇到的问题与 DataGridView refresh causes "Not Responding" application (but only when not in Visual Studio)
非常相似在将我的数据加载到我的 Winforms 应用程序表单时,我临时禁用了一个面板来填充表单并包含所有控件,并在完成后重新启用它。
如示例中所示,我使用 BackgroundWorker
加载数据并使用线程安全 bgWorkerSend_ProgressChanged
或 bgWorkerSend_RunWorkerCompleted
与 UI.[=16 交互=]
我还有一个 Windows 表单计时器,它会在闲置 5 分钟后以相同的方式刷新表单。
奇怪的是,在初始化加载结束时,面板被正确启用,而在后面的刷新中,应用程序进入 "Not Responding" 模式,并永远保持在那里。此外,这仅在我直接执行应用程序时才会发生。如果从 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
,该 DataSet
已在主线程中较早实例化。
通过将实例化转移到 BackgroundWorker 线程中,问题得到解决,panel1.Enabled = true;
现在可以在 _bw_ProgressChanged
中正确执行。