我正在使用以下代码从并行线程加载数据网格视图中的文档:块内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);
}));
}
}