Проверьте, есть ли тема в графическом интерфейсе - PullRequest
5 голосов
/ 01 декабря 2010

Как я могу проверить, находится ли текущий запущенный поток в контексте GUI или нет?

Ответы [ 3 ]

5 голосов
/ 01 декабря 2010

К сожалению, трудно ответить на этот вопрос со 100% точностью, потому что не всегда совершенно очевидно, что составляет контекст GUI.Это скорее эвристика, чем ответ да / нет.И эвристика будет разной для каждой среды графического интерфейса.

Для WPF лучше всего проверить и посмотреть, есть ли там активный Dispatcher для текущего потока

public static bool IsWpfGuiThread() {
  return Dispatcher.FromThread(Thread.CurrentThread) != null;
}

Однако этоможно одурачить, просто установив Dispatcher в случайном потоке, но на самом деле не помещая GUI поверх него.

Для WinForms хорошей проверкой является текущий SynchronizationContext.

public static bool IsWinFormsGuiThread() {
  return SynchronizationContext.Current is WindowsFormsSynchronizationContext;
}

Однако кто-то может временно (или дольше) обмануть это, сбросив значение Current в другой контекст синхронизации.По сути, это всего лишь глобальная нить и может быть установлена ​​любым пользователем.В некоторых приложениях, таких как Visual Studio, это довольно распространенное изменение (но это приложение WPF)

1 голос
/ 13 марта 2012

Вы спрашиваете, есть ли у вас известный объект графического интерфейса, можете ли вы запросить его, чтобы убедиться, что вы находитесь в правильном контексте этого объекта? Я думаю guiObject.VerifyAccess() будет работать для этого.

0 голосов
/ 01 декабря 2010

Я думаю, вам нужен объект Dispatcher.Смотри http://social.msdn.microsoft.com/forums/en-US/wpf/thread/360540eb-d756-4434-86f9-a3449f05eb55

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...