当向winform数据网格视图异步添加行时,C#无法访问已释放的对象



我正在使用以下代码从并行线程加载数据网格视图中的文档:块内Task.Run(() => {});

当我关闭表单时,我得到ObjectDisposedExceptionCannot access a disposed object.看起来if (IsDisposed || Disposing)失败了,代码试图添加一行,同时Disposed变为true。

我可以发现这个异常,但它很脏。

添加在关闭表单时启用的标志以检查表单是否已关闭,效果不佳。它的行为方式似乎与this.Disposing相同

if (this.IsDisposed || this.Disposing)之前添加Thread.Sleep(5);似乎足以避免引发异常,尽管我不确定如果运气不好的话是否会引发异常。

避免这个问题的最佳做法可能是什么?

foreach (var doc in docList)
{
if (this.InvokeRequired)
{
if (IsDisposed || Disposing || dgv.IsDisposed || dgv.isposing) return;
this.Invoke(new MethodInvoker(() => { dgv.Rows.Add(doc.Name); }));
}
}

不知道关闭后要对表单做什么。如果可以隐藏它,使用这个:

private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
this.Hide();
}

您是否尝试在Invoke:中添加条件

if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(() => 
{
foreach (var doc in docList)
{
if (IsDisposed || Disposing || dgv.IsDisposed || dgv.isposing)  return;
dgv.Rows.Add(doc.Name); 
}));
}
}

最新更新