1

我正在尝试在后台线程中创建动态自定义 userControl。这是我创建新线程的方法:

var thread = new Thread(CreateItemInBackgroundThread);
thread.SetApartmentState(ApartmentState.STA);            
thread.Start();
thread.Join();

这是方法CreateItemInBackgroundThread

var uc = new MyUserControl();
UserControl item = uc;
AllControls.Add(item);
//Here I am trying to add control to a current Tab
foreach (var currentTab in _allTabs)
{
    currentTab.DocumentWindow.Dispatcher.BeginInvoke(new Action(() =>
                                                            {
                                                                if (tab.DocumentWindow.IsSelected)
                                                                {
                                                                    tempTab = tab;
                                                                    tempControl = item;
                                                                    finish = true;
                                                                }

                                                            }));
}

这是我的完成属性

bool finish
    {
        get { return _finish; }
        set
        {
            _finish = value;
            if (_finish)
            {
                tempTab.AnimatedCanvas.Dispatcher.BeginInvoke(new Action(() => tempTab.AnimatedCanvas.Children.Add(tempControl)));
            }
        } // Here I get error - The calling thread cannot access this object because a different thread owns it
    }

我怎样才能避免这个错误以及为什么会发生这个错误?

4

2 回答 2

0

出现此错误是因为您必须在同一线程上执行不同的任务,例如 U 无法使线程异步并使用同一线程更新 UI。这将导致冲突。因为 UI 线程是主线程。

您可以使用 BAckground Worker Thread 并将其两个 eventHandlers 订阅到您想要处理的事件中......例如-

BackgroundWorker Worker=new BackgroundWorker();
worker.DoWork+=Yorevent which will do the timeTaking Task();
Worker.RunWorkerCompleted+=YOurEvent which will Update your UI after the work is done();
worker.RunWorkerAsync();

RunWorkerAsync() 将使您的线程异步并在后台工作,这样它也不会导致任何线程错误..

于 2013-07-02T11:10:48.617 回答
0

正如错误所说,您无法访问 this 对象,因为不同的线程拥有它,因此您可以使用调用该线程Invoke(Delegate Method) 您可以检查是否需要使用调用tempTab.InvokeRequired

于 2013-07-02T10:19:17.473 回答