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

时间:2015-08-13 14:54:48

标签: c# winforms .net-3.5 backgroundworker

我的问题与DataGridView refresh causes "Not Responding" application (but only when not in Visual Studio)

非常相似

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

在示例中,我使用BackgroundWorker加载数据并使用线程安全bgWorkerSend_ProgressChangedbgWorkerSend_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();
    }
}

1 个答案:

答案 0 :(得分:0)

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

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