获取在尝试隐藏表单时无法访问已处置的对象

时间:2012-11-08 15:56:11

标签: c# winforms multithreading

我有一个基于MDI的图表应用程序。每个子表单都是包含图表的表单。每个图表都有自己的数据队列和专用的工作线程。

在工作线程DoWork方法中,我有一个由bool“IsChartActive”控制的while循环,它将绘制图形上的数据。为了绘制数据,我在chartForm本身上调用Invoke并将委托传递给应该更新图表的方法。

当用户关闭图表表单时,我不会实际关闭它,而是停止图表更新,并希望隐藏图表,直到用户想要再次查看它。

为此,我处理FormClosing事件,设置Cancel = true,设置“IsChartActive = false”并调用ChartForm.Hide()。

但是在此之后我在DoWork方法中得到了“无法访问被处置对象”的异常(我假设这是因为当我设置“IsChartActive = false”时后台线程已经在invoke语句中,所以它会在图表上调用invoke时,看到下一次迭代的变化。

为什么我会收到此异常,即使图表实际上并未处理但只是隐藏?

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;
            }
        }

0 个答案:

没有答案