Как я могу узнать, выполняется ли метод на потоке UI или не отделенным способом?

Для меня решение было немного проще, мне просто нужно было очистить репозиторий: .m2 / repository / org / apache / maven / archetypes

6
задан 25 May 2009 в 15:34
поделиться

2 ответа

Небольшое пояснение, хотя обычно существует только 1 поток пользовательского интерфейса, но может быть много потоков пользовательского интерфейса. Это верно как для WPF, так и для WinForms.

Но лучший способ достичь этого - использовать SynchronizationContext. И WPF, и WinForms устанавливают SynchronizationContext в любом потоке, в котором они запускают пользовательский интерфейс. Это функция, которую я использую, если я не привязан к какой-либо конкретной модели пользовательского интерфейса.

public bool IsPossiblyUIThread() {
  return SynchronizationContext.Current != null;
}

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

несколько более надежный способ сделать это следующим образом. Но для реализации требуется ссылка хотя бы на часть WPF.

public bool IsLikelyWpfUIThread() {
  var context = SynchronizationContext.Current;
  return context != null && context is DispatcherSynchronizationContext;
}
9
ответ дан 9 December 2019 в 22:39
поделиться

Диспетчер. CheckAccess () возвращает истину, если ваш код работает в том же потоке, что и Диспетчер. Он должен работать, если есть только один Dispatcher / UIThread.

2
ответ дан 9 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: