我有一个基于 MDI 的图表应用程序。每个子窗体都是一个包含图表的窗体。每个图表都有自己的数据队列和专用的工作线程。
在工作线程 DoWork 方法中,我有一个由布尔“IsChartActive”控制的 while 循环,它将在图表上绘制数据。为了绘制数据,我在 chartForm 本身上调用 Invoke 并将一个委托传递给应该更新图表的方法。
当用户关闭图表表单时,我并没有真正关闭它,而是停止图表更新并希望隐藏图表,直到用户想要再次查看它。
为此,我处理 FormClosing 事件,设置 Cancel = true,设置“IsChartActive = false”并调用 ChartForm.Hide()。
但是在此之后,我在 DoWork 方法中得到了“无法访问已处理的对象”异常(我假设这是因为当我设置“IsChartActive = false”时后台线程已经在调用语句中,所以它会看到变化在下一次迭代中),在图表上调用调用时。
为什么我会得到这个异常,即使图表实际上并没有被处理而只是隐藏了?
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;
}
}