我目前正在尝试使用后台工作程序将我的表单上的图表更新到:
bwCharter.RunWorkerAsync(chart1);
这段代码运行:
private void bcCharter_DoWork(object sender, DoWorkEventArgs e)
{
System.Windows.Forms.DataVisualization.Charting.Chart chart = null;
// Convert e.Argument to chart
//..
// Converted..
chart.Series.Clear();
e.Result=chart;
setChart(c.chart);
}
private void setChart(System.Windows.Forms.DataVisualization.Charting.Chart arg)
{
if (chart1.InvokeRequired)
{
chart1.Invoke(new MethodInvoker(delegate { setChart(arg); }));
return;
}
chart1 = arg;
}
然而,在清理系列的时候,会引发异常。
基本上,在清理系列后,我想要做更多的处理,这会完全减慢GUI的速度 - 所以希望在另一个线程中进行。
我认为通过将它作为参数传递,应该是安全的,但显然不是!
有趣的是,图表在一个选项卡页上。如果选项卡页在后台运行,我可以一遍又一遍地运行此操作,但如果我运行此操作,查看图表,然后再隐藏它,并重新运行,则会抛出异常。显然,如果图表在前景中,则会抛出异常。
有人能建议我如何进行不同的操作吗?
谢谢!
编辑: 我知道这可以在窗体线程中完成,因为当我再次分配它时是这样的。然而,使用后台工作程序的整个目的是避免使整个程序停顿。正如我所说,有比这个命令更多的处理。
我认为通过将其作为参数传递,可以无障碍地在那个线程中访问它,但是否有可能这个传递的图表仍然以某种方式指向原始图表?如果是这样,该如何解决?
我希望尽可能少地阻止GUI线程 - 因此似乎没有仅调用每个命令的意义。