启用面板会导致 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_ProgressChangedbgWorkerSend_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 中正确执行。