this.dispatcher.invoke()不适用于多线程?

时间:2013-02-22 14:59:41

标签: c# wpf multithreading

我再次遇到此错误:调用线程无法访问此对象,因为另一个线程拥有它。

这是我的代码:

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

1 个答案:

答案 0 :(得分:1)

你在哪里创建 timeDomainPlotter?

在不同线程上创建的控件具有不同的Dispatchers。我的猜测是你遇到了这个错误,因为你是通过'this.Dispatcher'调用你的委托,但你在该委托中触摸的控件是在另一个线程上创建的,因此有一个不同的调度程序'本'。

如果它位于不同的线程上,也许你可以为创建设置一个委托并通过this.Dispatcher调用该委托,那么控件将在你稍后尝试访问它的同一个线程上创建。