调用线程无法访问此对象,因为拥有该对象的是另一个线程



我使用DynamicDataDisplay来进行绘图。我得到了一个错误消息:调用线程不能访问这个对象,因为当调试器达到以下行时,不同的线程拥有它:

Action AddLineGraph = delegate()
{    
    timeDomainPlotter.AddLineGraph(_ods,
        new Pen(_curveColors[_statsEnableIndex[i]], 2),
        new CirclePointMarker { Size = 5, Fill = _curveColors[_statsEnableIndex[i]] },
        new PenDescription(Convert.ToString(j)));
};
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, AddLineGraph);

我对此感到困惑,因为当我使用LineGraph绘制plot时如下:

Action AddLineGraph = delegate()
{
    timeDomainPlotter.AddLineGraph(_ods, 2, "Ch" + Convert.ToString(j) + _statsName[_statsEnableIndex[i]]);
};
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, AddLineGraph);

运行良好。所以我想知道为什么画点标记给出错误信息?谢谢。

编辑:这里是我添加的更多代码,其中_curveColors是定义的。

public void InitiatePlot()
{
//  InitializeComponent();
    //   timeDomainPlotter.Legend.Remove();
    _initialChildrenCount = timeDomainPlotter.Children.Count;
    int count = timeDomainPlotter.Children.Count;
    //do not remove the initial children
    if (count > _initialChildrenCount)
    {
        for (int i = count - 1; i >= _initialChildrenCount; i--)
        {
            timeDomainPlotter.Children.RemoveAt(i);
        }
    }

//  _curveColors = new System.Drawing.Color[_nMaxStatsPerChannel];
    _curveColors = new Brush[_nMaxStatsPerChannel];

    for (int i = 0; i < _nMaxStatsPerChannel; i++)
    {
        _curveColors[i] = new SolidColorBrush((Color)ColorConverter.ConvertFromString(_colorList[i]));
    // _curveColors[i] = System.Drawing.Color.FromName(_colorList[i]);
    }
    _statsName = Enum.GetNames(typeof(Window1.ROISignalList));

    //_statsEnableIndex = new int[_nActiveStatsPerChannel];
    for (int j = 0; j < _nActiveChannels; j++)  // init data source structure
    {
    // count = 0;
        for (int i = 0; i < _nActiveStatsPerChannel; i++)
        {
            _ods = new ObservableDataSource<Point>();
            _odsAll[j * _nActiveStatsPerChannel + i] = _ods;   // _osdAll: C0S0 C0S1 C0S2 C1S0 C1S1 C1S2 ... C4S0 C4S1 C4S2

            Action AddLineGraph = delegate()
        {
            timeDomainPlotter.AddLineGraph(_ods,
                    new Pen(_curveColors[_statsEnableIndex[i]], 2),
                    new CirclePointMarker { Size = 5, Fill = _curveColors[_statsEnableIndex[i]] },
                    new PenDescription(Convert.ToString(j)));
        };
        this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, AddLineGraph);
        }
    }
}

我找到原因了。就像SpaceghostAli提到的,_curveColors确实是导致这个错误的罪魁祸首。

我不得不说我没有完全弄清楚为什么,但是如果我用定义的颜色替换所有的_curveColors,问题就解决了。特别地,下面是给出错误的代码:

Action AddLineGraph = delegate()
{
    timeDomainPlotter.AddLineGraph(_ods,
        new Pen(_curveColors[_statsEnableIndex[i]], 2),
        new CirclePointMarker { Size = 5, Fill = _curveColors[_statsEnableIndex[i]] },
        new PenDescription(Convert.ToString(j)));
};
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, AddLineGraph);
下面是没有错误的代码:
Action AddLineGraph = delegate()
{
    timeDomainPlotter.AddLineGraph(_ods,
        //new Pen(_curveColors[_statsEnableIndex[i]], 2),
        new Pen( new SolidColorBrush(Colors.Transparent), 2),
        new CirclePointMarker { Size = 5, Fill = new SolidColorBrush(Colors.Green) },
        new PenDescription(Convert.ToString(j)));
};
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, AddLineGraph);

,你可以看到只有_curveColors被更改为确定性的颜色。

我猜_curveColors不是在UI线程上创建的。您应该回溯并查看InitiatePlot是如何被调用的,并确保UI线程拥有_curveColors.

相关内容

  • 没有找到相关文章

最新更新