应用程序挂在控件上.除非在调试时调用
本文关键字:调试 调用 控件 应用程序 | 更新日期: 2023-09-27 17:57:39
我的主窗体使用Delegate.BeginInvoke
开始了一些后台工作,在这些委托中,我添加了一些行,以显示在主窗体的DataGridView
上。我有一个后台数据集和一个BindingSource
,我将其用作DataGridView
的源。
每当我添加一行时,我都会这样做:
ResultsDataTable.AddResultsRow(row);
RefreshDataGridView();
RefreshDataGridView()
如下所示:
private void RefreshDataGridView()
{
if(InvokeRequired)
{
//I have tried dgvResults.Invoke() as well
dgvResults.BeginInvoke(new Action(() => RefreshDataGridView()));
}
else
{
dgvResults.Refresh(); //this is where it hangs
dgvResults.FirstDisplayedScrollingRowIndex = dgvResults.Rows.Count - 1;
}
}
它工作得很好,当我添加新行时,它会立即显示并按预期滚动(尽管我的滚动条没有正确绘制,但我可以接受),但只有当我通过调试器运行应用程序时。当我在没有调试的情况下启动它时,每当添加一行并且实际需要滚动时,应用程序就会挂起。
我已经在调试模式下构建了应用程序,并在不进行调试的情况下运行它,然后让它到达挂起的位置,并将调试器附加到进程,以查看它在哪里发生(请参阅上面代码中的注释)。
我知道这是因为我的主线在等待什么,但我不知道它在等待什么或如何找到。
有人有什么想法吗?
更新:我在没有调试的情况下启动了它,然后再次附加调试器,发现主线程在更新控件时遇到了问题,但我不知道是哪一个。
更新2:我取消了刷新,现在添加新行时它不会挂起,但如果不挂起,我就无法调整表单的大小。
更新3:在尝试更新数据网格的滚动条时,它似乎挂起了,所以我将它封装在一个面板中,并给出了滚动条。通过一点黑客攻击,让数据网格根据其包含的数据动态调整大小,这有点小故障,但不会再出现死锁。
我遇到了同样的问题。你提到你的DataGridView有一个绑定源。如果你对源做了什么,那么你就影响了DataGridView。您需要将修改源代码的那行代码放在BeginInvoke语句中。一旦我做到了,问题就消失了。