У меня есть отдельный поток, который прослушивает данные. И при получении некоторых данных ему необходимо получить доступ к одному из окон в приложении и установить некоторые поля для этого окна.

Прямо сейчас, когда я использую это, он выдает исключение (говоря, что эти потоки не могут получить доступ, поскольку Windows1 принадлежит другому потоку):

        foreach (Window w in App.Current.Windows)
        {
            if (w.Name == "WindowIamInterested")
            {
                //w.SetField set some fields in the window and 
                //and do w.Show() or w.Activate() to show the window to user
            }
        }

Приведенный выше код выполняется в отдельном потоке, а не в основном потоке. Есть ли способ получить доступ к окну и изменить его.

0
VNarasimhaM 18 Фев 2010 в 19:30

3 ответа

Лучший ответ

Вы можете использовать Dispatcher.Invoke :

Application.Current.Dispatcher.Invoke(
   (ThreadStart)delegate
   {
      // do your UI work here
   });

Dispatcher.Invoke выполняется синхронно. Если вы хотите выполнять асинхронно, вы можете использовать Dispatcher .BeginInvoke.

1
Dave Clemmer 27 Сен 2011 в 01:52

Вам нужен диспетчер окна? ? Вы можете получить диспетчера из окна и попросить его выполнить ваш код через Dispatcher.Invoke () или Dispatcher.BeginInvoke ()...

2
Anvaka 18 Фев 2010 в 20:41

Если вы работаете с элементом управления WPF, вы должны использовать его диспетчер для планирования обновления в потоке пользовательского интерфейса:

myControl.Dispatcher.BeginInvoke(
  System.Windows.Threading.DispatcherPriority.Normal
  , new System.Windows.Threading.DispatcherOperationCallback(delegate
  {                   
    // update control here
    return null;
  }), null);

Вы должны использовать Invoke(), если вам нужно заблокировать до обновления элемента управления, в противном случае вы должны использовать BeginInvoke().

1
Dave Clemmer 27 Сен 2011 в 01:52
Но как мне получить доступ к myControl. Здесь myControl - это окно. Итак, как мне получить доступ к окну. Он выдает исключение, если я пытаюсь получить к нему доступ.
 – 
VNarasimhaM
18 Фев 2010 в 21:50