gpt4 book ai didi

c# - 使用 BackgroundWorker 更新 C# Chart

转载 作者:太空狗 更新时间:2023-10-30 00:57:38 25 4
gpt4 key购买 nike

我目前正在尝试使用以下方法将表单上的图表更新给后台工作人员:

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 - 所以想在另一个线程中进行。

我认为通过将其作为参数传递,我应该是安全的,但显然不是!

有趣的是,图表在标签页上。如果标签页在后台,我可以一遍又一遍地运行它,但如果我运行它,查看图表,再次隐藏它,然后重新运行,它会抛出异常。显然,如果图表也在前景中,它就会抛出。

谁能建议我可以做些什么?

谢谢!


编辑:我知道这可以在表单线程中完成,就像我再次分配它一样。然而,使用后台 worker 的全部意义在于避免让整个程序陷入停顿。正如我所说,处理的不仅仅是这个命令。

我假设将它作为参数传递可以让我在该线程中不受阻碍地访问它,但是这个传递的图表是否有可能仍然以某种方式指向原始图表?如果是这样,如何克服?

我想尽可能少地阻塞 GUI 线程 - 因此只调用每个命令似乎没有意义。

最佳答案

如果你想先清除它,然后在重新显示它之前做很多异步工作,为什么不在调用 之前调用 chart.Series.Clear(); >后台 worker ?在这种情况下,它会在主 UI 线程上被清除,然后您在再次从 UI 线程设置图表之前执行一些异步工作。

此外,在使用 BackgroundWorker 时,我会使用内置的 ReportProgress 和 WorkerCompleted 事件来避免手动跨线程调用。这就是首先使用 BackgroundWorker“免费” 获得此类功能的部分原因。因此,应该在 WorkerCompleted 中设置图表以简化您的代码(即使在本例中这不是问题的根源)。

关于c# - 使用 BackgroundWorker 更新 C# Chart,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4678602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com