我怎么能检查当前正在运行的线程上的GUI环境或不?检查如果线程在GUI语境
5
A
回答
5
这是不幸的是困难的,因为它并不总是完全是显而易见的是什么构成一个GUI上下文回答与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应用程序虽然)
0
1
你问你是否有一个已知的gui对象,你可以查询它,看看你是否在正确的上下文那个对象?我认为guiObject.VerifyAccess()
将为此工作。
相关问题
- 1. GUI +线程,GUI退出线程停留 - >如何在GUI再次启动时检测线程?
- 2. 如何检测主线程在GUI中冻结GUI?
- 3. 在Qt库中检测GUI线程
- 4. 如果语句检查
- 5. Java如果语句检查
- 6. 语境在可运行线程
- 7. 如果发生错误,IO线程警告GUI线程
- 8. 线程在GUI中
- 9. 在多线程环境中尽管空检查得到NullPointerException
- 10. 如果下划线中的语句检查条件?
- 11. VB6 GUI不能在多线程COM环境中工作
- 12. helper方法检查,如果窗口是在另一个线程
- 13. 如果MATLAB在多线程模式下运行检查
- 14. 不断检查,如果在不同的线程
- 15. 从主GUI线程检索信息
- 16. 如果一个线程在多线程环境中崩溃,如何关闭JVM?
- 17. 线程在WPF GUI线程太慢
- 18. Java GUI线程
- 19. Java的Android的境界检查,如果对象是存在的(检查两个)
- 20. 检查coldfusion线程
- 21. 在Java中的GUI线程
- 22. 如果语句只检查一次?
- 23. 如果语句检查提交(PHP)
- 24. 如果语句检查性别
- 25. C++简单如果语句不检查?
- 26. 如果语句检查使用==
- 27. 如果语句检查NSArray大小
- 28. 如果语句检查源图像
- 29. 的语义检查,如果条件
- 30. 如果语言环境没有代码页,如何检测语言环境/语言?
我知道这是一个古老的答案,但...可以有多个UI线程在一个WPF应用程序,检查使用[Dispatcher.FromThread()](HTTPS当前线程上的活动调度:// MSDN。 microsoft.com/en-us/library/system.windows.threading.dispatcher.fromthread(v=vs.110).aspx)不是一个很好的指标,它是一个(或“该”)UI线程。处理这种情况的最佳方法之一是跟踪启动长时间运行或后台线程的线程的SynchronizationContext,这是异步/等待可能有用的地方(而不是在首次写入此答案时存在)。 – slugster 2017-12-01 10:32:12