Как проверить, работает ли текущий поток в контексте GUI или нет?Проверить, является ли Thread Is On Gui Context
ответ
К сожалению, трудно ответить на этот вопрос с точностью 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).
Я думаю, вы хотите объект Dispatcher
. См. http://social.msdn.microsoft.com/forums/en-US/wpf/thread/360540eb-d756-4434-86f9-a3449f05eb55
Вы спрашиваете, есть ли у вас известный объект gui, вы можете запросить его, чтобы узнать, находитесь ли вы в правильном контексте этот объект? Я думаю, guiObject.VerifyAccess()
будет работать для этого.
- 1. UIMangedDocument Context is nil
- 2. Is boost :: thread thread-safe?
- 3. Как проверить, выполняется ли обратный вызов в GUI Thread: Android
- 4. is RSA_sign thread safe
- 5. Is org.reflections.Reflections thread safe
- 6. Is ConstructorInfo.GetParameters Thread-Safe?
- 7. log4j и thread context classloader
- 8. Является ли GenericObjectPools заимствованным методом Thread Thread?
- 9. Spring Security Child Thread Context
- 10. IS ResultSet Thread safe
- 11. Wake Thread On Signal
- 12. Является ли WinForms GUI?
- 13. CGBitmapContextCreateImage on flipped context
- 14. Is String.intern() thread safe
- 15. Is EnumWindows thread safe
- 16. Как проверить, существует ли «Thread»?
- 17. Is ActionMailer :: Base.default_url_options thread safe?
- 18. Executors.newSingleThreadExecutor() thread is alive WhileTimeout is 0L
- 19. Perl win32 :: GUI thread
- 20. Ошибка C# GUI Thread
- 21. 'QThread: Destroyed while thread is still running' on quit
- 22. The Thread is On WaitSleepJoin State и больше не работает
- 23. Является ли java.sql.Connection thread безопасным?
- 24. Является ли NSPersistentStoreCoordinator Thread безопасным?
- 25. Является ли Thread объектом ядра?
- 26. Java Gui Thread Coding?
- 27. is lib magic thread-safe?
- 28. Is [WkInterfaceDevice addCachedImage:] Thread Safe?
- 29. Is IronRuby ScriptSource.Execute thread safe?
- 30. Имеет ли смысл запускать Thread in Context Listner в J2EE?
Я знаю, что это старый ответ, но ... в приложении 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