Вызывающий поток не может получить доступ к этому объекту, потому что другой поток владеет им - PullRequest
0 голосов
/ 17 февраля 2012

Кажется, на форуме найдено много таких ошибок, но я не могу применить большинство из них к моей ситуации ..

Моя проблема:

У меня есть страница PosterHome.xaml с равномерной сеткой. В моем коде позади, у меня есть ничья:

drawThread = new Thread(new ThreadStart(drawPosters));
                drawThread.SetApartmentState(ApartmentState.STA);
                drawThread.Start();

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

while (true)
{
  waitEvent.WaitOne();
  //do some calculations
  // change uniform grid rows & cols
  posterUniformGrid.Rows = calculatedRows; //**-> error is first thrown here**
  posterUniformGird.Columns = calculatedCols;             
}

Как мне справиться с этим? Заранее спасибо.

Приветс Даан

Ответы [ 2 ]

7 голосов
/ 17 февраля 2012

Вы пытаетесь получить доступ к posterUniformGrid, который был создан в потоке пользовательского интерфейса из фонового потока.

Чтобы избежать этого, используйте Диспетчер .

Dispatcher.Invoke(DispatcherPriority.Normal, 
                    new Action<object[]>(SetGrid), 
                    new object[] { calculatedRows, calculatedColumns });
0 голосов
/ 17 февраля 2012

Вы можете попробовать это:

 while (true)
 {
   waitEvent.WaitOne();
   this.InvokeEx(t => t.posterUniformGrid.Rows = calculatedRows); 
   this.InvokeEx(t => t.posterUniformGird.Columns = calculatedCols);             
 }

 public static class ISynchronizeInvokeExtensions
    {
        public static void InvokeEx<T>(this T @this, Action<T> action) where T : ISynchronizeInvoke
        {
            if (@this.InvokeRequired)
            {
                try
                {
                    @this.Invoke(action, new object[] { @this });
                }
                catch { }
            }
            else
            {
                action(@this);
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...