К сожалению, трудно ответить на этот вопрос со 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)