我知道在.NET中,需要使用Control.Invoke(委託)來對控件執行操作。這導致我想知道在哪些環境中Invoke實際上是需要的。據我所知,在Visual Basic和Pascal的舊版本中並不需要它。特別是,Java的狀態(可能是版本依賴?)和「老式」Windows GUI編程(手動讀取消息隊列)的狀態是什麼?需要什麼語言/平臺調用GUI操作?
回答
在大多數語言中調用GUI操作是必要的。在Java中有SwingUtilities.invokeLater。實際上,如果使用多個線程,則在任何環境中都需要這樣的方法。原因是主UI線程運行事件通知機制。能夠與此機制交互的第二個線程需要以某種方式與其進行同步。
這些調用方法實際上是開發人員的方便。在不存在的平臺中,並不意味着它被允許從另一個線程訪問UI項目。這可能意味着開發人員應該實現自定義機制(發送事件)來執行此操作。 UI代碼很少是線程安全的。我曾與許多平臺和技術合作過,並且始終遵循以下規則:僅從單個線程觸摸UI。
其實,只有當GUI運行多於1個線程時才需要它。使用WinForm(和WPF)應用程序,GUI在單線程STA線程上運行(這可以追溯到COM,不要問我爲什麼會這樣,因爲我不知道)。
如果您嘗試從其他線程調用在STA線程上創建的對象,則會進行檢查以確保引發異常。 WPF也是如此,但WPF使得這更加優雅。
無論如何,你可以實際檢查何時Invoke是必需的,因爲有一個屬性。建議使用此模式來幫助處理WinForm應用程序中的多個線程。
上述代碼提供了一種設置Text屬性的全方位方法,您可以根據需要對其進行定製。
你錯了。 Control.Invoke不需要在控件上執行操作。
Control.Invoke是一個有用的工具,它可以幫助編制跨線程的代碼,但它不是唯一的方法。當您在後臺線程中執行某些工作時,您會看到最經常使用的功能。
當您從後臺線程調用必須更新Windowed控件(即具有Windows窗口句柄並通過消息泵處理消息的控件)的代碼時,請更改其屬性或控件的其他操作,然後您必須將控制傳遞給MessagePump線程,並且Control.Invoke是一種有效的方法來解決這個問題。
在全部在Windows下運行的程序,您不能調用在後臺線程上更新控件的函數。有些語言可能會在後臺處理這些細節,但我不知道有任何問題。
Invoke只是Win32 API PostMessage的一個包裝。只有擁有窗口的線程才被允許訪問該窗口。當Windows是單線程的時候,這是遺留下來的。這意味着PostMessage是在Windows上訪問真實窗口的正確方法,無論您使用的是什麼(VB6,Delphi,.NET或其他),但是不同的編程語言提供了包裝來讓我們的生活更輕鬆。
- 1. 需要安全的跨平臺gui語言
- 2. GUI依賴於語言和平臺?
- 3. 跨平臺,語言不可知的GUI標記語言?
- 4. 還有其他什麼像WCF,其他平臺,操作系統,語言?
- 5. 爲什麼c語言需要((;;))循環?
- 6. 使語言成功需要什麼?
- 7. MTL庫需要什麼語言擴展?
- 8. 語言和平臺
- 9. 需要「多語言」「跨平臺」文件格式
- 10. 是否有跨平臺的腳本語言,不需要安裝?
- 11. 我應該使用什麼語言來創建跨平臺庫?
- 12. Cassandra:什麼操作需要重啓?
- 13. Kindle SDK語言/平臺
- 14. 最好的跨平臺GUI和USB語言
- 15. 對.NET語言的跨平臺GUI編程提供建議?
- 16. 哪些IPC機制需要GUI應用程序? Windows平臺
- 17. 爲什麼要使用iGoogle平臺
- 18. api.ai和wit.ai的前端語言/平臺是什麼?
- 19. 需要一致的調試常量來觸發所有平臺上的操作
- 20. 使用主機操作系統風格的跨平臺GUI庫
- 21. 爲什麼我不需要調用操作員在JavaScript中調用函數?
- 22. 要做這樣的事情需要什麼語言?
- 23. 爲什麼網絡應用需要後端語言?
- 24. 如果我想使用Telerik的Kendo UI,需要什麼語言?
- 25. Roomba使用哪種平臺/語言?
- 26. 每種主要語言和平臺的使用率是多少?
- 27. 用於原型多媒體應用的跨平臺語言+ GUI工具包
- 28. 其他語言與Python有什麼協同作用?需要建議
- 29. 序言:不平等操作
- 30. 使用什麼框架在mozilla平臺中啓用跨語言交流?
這與STAthread與否無關。確實,STA線程與COM相關,但僅用於互操作目的。 Windows要求對控件的更新發生在與創建它的線程相同的線程上,STA或MTA無關緊要。 – 2009-02-26 09:02:11