我怎麼能檢查當前正在運行的線程上的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