C# 试图隐藏窗体时,获取无法访问已释放的对象
我有一个基于MDI的图表应用程序。每个子窗体都是一个包含图表的窗体。每个图表都有自己的数据队列和专用的工作线程 在worker-thread-DoWork方法中,我有一个while循环,由bool“IsChartActive”控制,它将数据绘制在图形上。为了绘制数据,我对chartForm本身调用Invoke,并将委托传递给应该更新图表的方法 当用户关闭图表表单时,我停止图表更新并想隐藏图表,直到用户想再次看到它,而不是实际关闭它 为此,我处理FormClosing事件,设置Cancel=true,设置“IsChartActive=false”,并调用ChartForm.Hide() 但是在这之后,当调用图表上的invoke时,我在DoWork方法中得到了“Cannotaccessapdisposedobject”异常(我假设这是因为当我设置“IsChartActive=false”时后台线程已经在invoke语句中,所以它将在下一次迭代中看到更改) 为什么我会得到这个异常,即使图表实际上没有被处理,只是被隐藏了C# 试图隐藏窗体时,获取无法访问已释放的对象,c#,winforms,multithreading,C#,Winforms,Multithreading,我有一个基于MDI的图表应用程序。每个子窗体都是一个包含图表的窗体。每个图表都有自己的数据队列和专用的工作线程 在worker-thread-DoWork方法中,我有一个while循环,由bool“IsChartActive”控制,它将数据绘制在图形上。为了绘制数据,我对chartForm本身调用Invoke,并将委托传递给应该更新图表的方法 当用户关闭图表表单时,我停止图表更新并想隐藏图表,直到用户想再次看到它,而不是实际关闭它 为此,我处理FormClosing事件,设置Cancel=tru
public void StopChartUpdates()
{
IsActive = false;
updateChartThread.CancelAsync();
}
private void updateChartThread_DoWork(object sender, DoWorkEventArgs e)
{
while (IsActive && !updateChartThread.CancellationPending)
{
try
{
ChartView.Invoke(new Action(InvokeOnUiThread));
}
catch (ObjectDisposedException ex)
{
//getting this error when calling invoke on ChartView
Trace.WriteLine("Exception: " + ex.Message);
}
Thread.Sleep(UpdateFrequency);
}
}
private void InvokeOnUiThread()
{
try
{
//update the chart
}
catch (Exception ex)
{
Trace.WriteLine("Exception: " + ex.Message);
}
}
private void ChartView_FormClosing(object sender, System.Windows.Forms.FormClosingEventArgs e)
{
StopChartUpdates();
if (e.CloseReason == CloseReason.UserClosing)
{
ChartView.Hide();
e.Cancel = true;
}
}
发布相关代码将有助于理解您的问题。我愿意猜测,当表单关闭时,该图表会被处理掉,因为没有其他任何东西在使用该图表的副本,所以GC会将其拾取。