2013-07-02 3 views
1

Я пытаюсь создать динамически настраиваемый пользовательский контроль в фоновом потоке. Это мой метод, где я создаю новую тему:Вызывающий поток не может получить доступ к этой ошибке объекта

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 
    } 

Как я могу избежать этой ошибки и почему эта ошибка произошла?

+1

http://stackoverflow.com/questions/11923865/how-to-deal-with-cross-thread-access-exceptions –

+0

Также почему вы пытаетесь использовать диспетчер какого-то конкретного объекта? Просто используйте 'Application.Current.Dispatcher'. –

+0

Я хочу получить доступ к tempControl, где мой динамически созданный элемент сохранен и помещен в UI, но в моем свойстве у меня всегда есть эта ошибка – Sasha

ответ

0

как говорит ошибка, вы не можете получить доступ к этому объекту, потому что другой поток владеет, так что вы можете ссылаться на эту нить с помощью Invoke(Delegate Method) вы можете проверить, если Invoke требуется, используя tempTab.InvokeRequired

0

Эта ошибка приходит потому, что u должен выполнять разные задачи в одном и том же потоке, например, U не может сделать нить асинхронной и обновлять пользовательский интерфейс, используя тот же поток. Это вызовет конфликт. Потому что поток пользовательского интерфейса является основным потоком.

Вы можете использовать фон рабочего потока и его двух Подписаться eventHandlers на свои мероприятия, которые вы хотите работать .. для eg-

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() сделает ваш поток идти асинхронной и работать на фоне таким образом, это не вызовет какой-либо поток Ошибка тоже ..

+0

Хорошая идея, но backgroundWorker здесь не пригодится, потому что мне нужно создать пользовательский пользовательский контроль, используя ApartmentState.STA – Sasha

Смежные вопросы

 Смежные вопросы