【发布时间】:2013-02-25 23:39:47
【问题描述】:
我制作了一个示例程序,它在后台线程上每秒生成 2000 个整数,当它完成时,它会触发一个事件,该事件会根据随机生成的数据在 GUI 上绘制图形(我的线程中有一个睡眠来模拟实际测量)。
private void SetChart(System.Windows.Forms.DataVisualization.Charting.Series series)
{
if (InvokeRequired)
{
SetChartCallback d = new SetChartCallback(SetChart);
this.Invoke(d, new object[] { series });
}
else
{
chart1.Series[0] = series;
chart1.Series[0].Name = "Generated Data";
}
}
我在 MSDN 网站上找到了这种方法。它工作正常,唯一的问题是,当我关闭应用程序时。有时会出现错误消息:
无法访问已处置的对象。
对象名称:“Form1”。
当我关闭程序时它会处理所有元素,我怎样才能防止这个错误不发生?
【问题讨论】:
-
推荐的方法是在所有后台线程都完成之前不要关闭表单。例如禁用关闭黄油,或覆盖关闭事件以通知用户当前正在后台发生某些事情并稍后重试。否则,如果您让表单关闭,它将在后台处理仍在进行时消失...
-
现在我正在检查 Thread.IsAlive 布尔值,但如果它返回 true 并且我调用 thread.Join() - 程序将冻结并且没有任何反应。
-
你在哪里调用thread.join?如果你在表单的结尾调用它,它将阻塞,直到你的后台线程完成——这就是 Join 所做的。
-
是的,我在表单结束时调用它(FormClosed 事件)。这是我想要在程序关闭之前完成这个线程的目标,但是 Join() 没有帮助,程序冻结并且它永远不会关闭。
-
对不起,你是对的,它调用了方法。我明天会在这里发帖。
标签: c# multithreading dispose invoke