访问在另一个线程中创建的变量时出错

时间:2013-07-03 13:01:42

标签: c# wpf multithreading mvvm

我想在不同的线程中动态创建自定义usercontrol。我的代码是

var thread = new Thread(() =>
{
    var uc = new UserControl05();

    UserControl item = uc;

    Parallel.ForEach(_allTabs, currentTab =>
    {
        if (currentTab.DocumentWindow.CheckAccess())
        {
            if (currentTab.DocumentWindow.IsSelected)
            {
               //some code
            }
        }
        else
        {
            currentTab.DocumentWindow.Dispatcher.BeginInvoke(new Action(() =>
            {                            
                if (!currentTab.DocumentWindow.IsSelected) return;
                if (currentTab.AnimatedCanvas.CheckAccess())
                {
                    currentTab.AnimatedCanvas.Children.Add(item); //here I get error
                }
                else
                {     
                    currentTab.AnimatedCanvas.Dispatcher.BeginInvoke(new Action(() =>
                    {
                        currentTab.AnimatedCanvas.Children.Add(item);
                    }));
                }
            }));
        }
     });

});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true; 
thread.Name = "Create Control";
thread.Start();

我收到错误调用线程无法访问此对象,因为另一个线程拥有它。我搜索了解决方案并尝试在那里使用调度程序,但它没有帮助并抛出相同的错误。我理解它正在发生,因为我已经在后台线程上创建了usercontrol但是如何修复它我不知道。

有人能提出什么建议吗?

1 个答案:

答案 0 :(得分:0)

WPF Apps以两个线程开始,一个UI线程和一个渲染线程。您必须在UI线程上创建usercontrol。