我的问题与DataGridView refresh causes "Not Responding" application (but only when not in Visual Studio)
非常相似在将我的数据加载到Winforms应用程序表单时,我暂时禁用填充表单并包含所有控件的面板,并在完成后重新启用它。
在示例中,我使用BackgroundWorker
加载数据并使用线程安全bgWorkerSend_ProgressChanged
或bgWorkerSend_RunWorkerCompleted
与UI进行交互。
我还有一个Windows窗体计时器,它在空闲时间为5分钟后以与表单相同的方式刷新。
奇怪的是,在初始化加载结束时,面板正确启用,而在后一次刷新时,应用程序进入“无响应”模式,并永远保留在那里。此外,这只在我直接执行应用程序时发生。如果从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();
}
}
答案 0 :(得分:0)
缩小问题的范围,它表明问题是因为BackgroundWorker
线程中的代码填充了在主线程中早先实例化的DataSet
。
通过将实例化移动到BackgroundWorker线程中,解决了问题,panel1.Enabled = true;
现在正在_bw_ProgressChanged
中正确执行。