应用程序挂在控件上.除非在调试时调用

本文关键字:调试 调用 控件 应用程序 | 更新日期: 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语句中。一旦我做到了,问题就消失了。