簡體   English   中英

非UI線程,UI訪問

[英]Non-UI thread, UI access

眾所周知,您無法從UI線程以外的任何其他線程更新UI。

但是,我剛剛發現了一些代碼,該代碼從沒有Exception的非UI線程獲取listview virtualsize的值。

所以,實際上我的問題是:您可以通過非UI線程與UI進行哪些交互?

謝謝西奧

因為它在工作時不會引發異常,但這並不意味着您應該這樣做。

問題在於,除了對更新UI的方法的Invoke要求外,這些控件還不支持多線程。 這意味着當UI線程在檢索數據時更新數據時,確實會損壞數據。

特定規則是您不能調用使用窗口句柄的Windows API函數。 使用屬性或調用控件的方法是否最終會進行這樣的API調用並不清楚。 MSDN文檔僅列出其中四個始終可以安全使用:InvokeRequired,Invoke(),BeginInvoke()和CreateGraphics()。

但是是的,有時屬性值可用,不需要API調用。 Text屬性是一個很好的例子。 緩存它是因為它經常使用。 讀取 Text屬性不會產生異常,您只會得到緩存的值。 但是編寫 Text屬性會變得很麻煩,更新屏幕上的文本需要API調用。 ListView.VirtualSize的工作原理完全相同。

您沒有得到例外,但它仍然不是猶太潔食。 畢竟,一毫秒后,UI線程也可能會更改Text屬性。 您將獲得一個過時的值,這是一個經典的線程問題,稱為競爭條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM