我再次遇到此错误:调用线程无法访问此对象,因为另一个线程拥有它。
这是我的代码:
public void InitiateSignalAnalysisPlot()
{
if (_nActiveChannel > 0) // timeDomainPlotter init
{
_dataX = new List<double[]>();
_dataY = new List<double[]>();
_dataX3 = new List<List<double[]>>();
_dataY3 = new List<List<double[]>>();
double[] dataXOneCh = new double[1];
double[] dataYOneCh = new double[1];
dataXOneCh[0] = 0;
dataYOneCh[0] = 0;
CirclePointMarker pm = new CirclePointMarker { Size = 5, Fill = Brushes.Transparent };
for (int i = 0; i < _nActiveChannel; i++)
{
if (_nActiveStatsOneChannel > 0)
{
for (int j = 0; j < _nActiveStatsOneChannel; j++)
{
_dataX.Add(dataXOneCh); // data x-y mapping init
_dataY.Add(dataYOneCh);
EnumerableDataSource<double> xOneCh = new EnumerableDataSource<double>(dataXOneCh);
EnumerableDataSource<double> yOneCh = new EnumerableDataSource<double>(dataYOneCh);
xOneCh.SetXMapping(xVal => xVal);
yOneCh.SetXMapping(yVal => yVal);
CompositeDataSource dsOneCh = new CompositeDataSource(xOneCh, yOneCh);
Action InitiatePlotter = delegate()
{
LineAndMarker<MarkerPointsGraph> lam = timeDomainPlotter.AddLineGraph(dsOneCh,
new Pen(pm.Fill, 2),
pm,
new PenDescription("C" + Convert.ToString(i) + "S" + Convert.ToString(j)));
};
this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, InitiatePlotter);
}
_dataX3.Add(_dataX);
_dataY3.Add(_dataY);
}
}
timeDomainPlotter.FitToView();
}
else
{
return;
}
}
错误发生在"this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, InitiatePlotter);"
这是主窗口线程调用的WPF窗口后面的一段代码。我很困惑,我已经使用dispatcher.invoke()来消除这个多线程冲突,为什么我仍然得到这个错误?如果我把这段代码放在int窗口的构造函数中,它可以工作,但我只是不想这样做。我可以做些什么改变以避免这个错误?感谢。
可能有用的更多信息: timeDomainPlotter在wpf窗口B中,在窗口A中启动(WindowB _windowB = new WindowB(););上面的代码InitiateSignalAnalysisPlot()也在窗口B中,但是在窗口A中调用InitiateSignalAnalysisPlot(),类似于_windowB,InitiateSignalAnalysisPlot();
如果我没有Dispatcher.Invoke()它,那么还会有一个例外The calling thread must be STA, because many UI components require this.
,发生在
LineAndMarker<MarkerPointsGraph> lam = timeDomainPlotter.AddLineGraph(dsOneCh,
new Pen(pm.Fill, 2),
pm,
new PenDescription("C" + Convert.ToString(i) + "S" + Convert.ToString(j)));
答案 0 :(得分:1)
你在哪里创建 timeDomainPlotter?
在不同线程上创建的控件具有不同的Dispatchers。我的猜测是你遇到了这个错误,因为你是通过'this.Dispatcher'调用你的委托,但你在该委托中触摸的控件是在另一个线程上创建的,因此有一个不同的调度程序'本'。
如果它位于不同的线程上,也许你可以为创建设置一个委托并通过this.Dispatcher调用该委托,那么控件将在你稍后尝试访问它的同一个线程上创建。