2010-12-01 2 views

ответ

5

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

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

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

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

Для WinForms хороший, чтобы проверить текущий SynchronizationContext.

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

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

+0

Я знаю, что это старый ответ, но ... в приложении WPF может быть несколько потоков пользовательского интерфейса, проверяя активный диспетчер на текущий поток, используя [Dispatcher.FromThread()] (https: // msdn. microsoft.com/en-us/library/system.windows.threading.dispatcher.fromthread(v=vs.110).aspx) не является хорошим индикатором того, что это (или «)» поток пользовательского интерфейса. Один из лучших способов справиться с этим - отслеживать SynchronizationContext потока, который инициирует длительный или фоновый поток, здесь может быть полезно async/await (а не то, что они существовали, когда этот ответ был впервые написан). – slugster 2017-12-01 10:32:12

1

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

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