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]);

. ./. .//接下来是一些数学运算,但这是所有与图表本身相关的…

你知道我怎样才能做我想做的吗?谢谢史蒂夫。

c# winform图表创建在公共和更新甚至触发的交叉线程错误

将您的更新代码放入这样的方法中(它可能已经是,但您还没有发布…):

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