c# winform图表创建在公共和更新甚至触发的交叉线程错误
本文关键字:错误 线程 更新 winform 创建 | 更新日期: 2023-09-27 18:10:06
我有一个图表,我已经创建和格式化(没有数据)在公共形式,就在initcomponent()之后。
在事件触发时填充系列(相机触发imageavailable事件),此时我收集一些像素并用数据填充系列。
这应该工作得很好,但我得到一个"跨线程错误",说我的图表是在不同的线程中创建的。
我的代码是这样的:
public Form1()
{
InitializeComponent();
CreateStarProfileChart();
.../...
下面是我的函数:
private void CreateStarProfileChart()
{
// Y axis init
StarProfile.ChartAreas.Add("Area1");
StarProfile.ChartAreas["Area1"].AxisY.Title = "Pixel Values";
StarProfile.ChartAreas["Area1"].AxisY.Minimum = 0;
StarProfile.ChartAreas["Area1"].AxisY.Maximum = 4096;
StarProfile.ChartAreas["Area1"].AxisY.Interval = 500;
StarProfile.ChartAreas["Area1"].AxisY.MajorGrid.Enabled = true;
StarProfile.ChartAreas["Area1"].AxisY.MajorGrid.LineColor = Color.Gray;
StarProfile.ChartAreas["Area1"].AxisY.MajorGrid.LineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Dash;
StarProfile.ChartAreas["Area1"].AxisY.MinorTickMark.Enabled = true;
// X axis init
StarProfile.ChartAreas["Area1"].AxisX.Title = "Pixels Accross Centroid";
StarProfile.ChartAreas["Area1"].AxisX.MajorGrid.Enabled = true;
StarProfile.ChartAreas["Area1"].AxisX.MajorGrid.LineColor = Color.Gray;
StarProfile.ChartAreas["Area1"].AxisX.MajorGrid.LineDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Dash;
StarProfile.ChartAreas["Area1"].AxisX.MinorTickMark.Enabled = true;
// Series init
StarProfile.Series.Add("StarProfile");
StarProfile.Series["StarProfile"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
StarProfile.Series["StarProfile"].BorderWidth = 2;
StarProfile.Series["StarProfile"].Color = Color.Black;
}
最后,这里是每隔几秒触发一次的事件中的代码:
// Clear Chart and Re-init Chart
StarProfile.Series["StarProfile"].Points.Clear();
StarProfile.ChartAreas["Area1"].AxisX.Minimum = -BoxDim;
StarProfile.ChartAreas["Area1"].AxisX.Maximum = BoxDim;
StarProfile.ChartAreas["Area1"].AxisX.Interval = 5;
for (int sl = -BoxDim; sl <= BoxDim; sl++)
{
// Add points to chart
StarProfile.Series["StarProfile"].Points.AddXY(sl, PixelMap[CoordX + sl, CoordY]);
. ./. .//接下来是一些数学运算,但这是所有与图表本身相关的…
你知道我怎样才能做我想做的吗?谢谢史蒂夫。
将您的更新代码放入这样的方法中(它可能已经是,但您还没有发布…):
void RefreshChart()
{
// Clear Chart and Re-init Chart
StarProfile.Series["StarProfile"].Points.Clear();
StarProfile.ChartAreas["Area1"].AxisX.Minimum = -BoxDim;
...
}
然后,从调用RefreshChart()
的代码(假设在后台线程中运行)中,使用匿名委托像这样调用它:
Invoke((Action)(() => RefreshChart()));
通过将函数调用编组回主UI线程,这应该可以消除您的错误。
(注意,在这种特殊情况下,您可以使用方法组语法进一步简化调用:)
Invoke((Action)RefreshChart);