如果我從非UI線程設置表單的Text屬性,那麼我需要使用Invoke來避免跨線程錯誤。但是,我可以讀取Text屬性而不使用Invoke。這安全嗎?如果我嘗試讀取表單的Handle屬性,則會出現交叉線程錯誤。如果我閱讀表單的IsDisposed屬性,它工作正常。如何知道何時需要使用Invoke?我應該總是使用調用來讀取和寫入屬性值?如何判斷屬性是否需要調用?
1
A
回答
4
無論何時您在UI線程中使用其他線程時,都應該在訪問UI對象時使用Invoke
。使用InvokeRequired
屬性來查明您是否實際上處於不同的線程中。
1
最簡單的方法是使用:
Delegate Sub SetTextCallback(ByVal [text] As String)
Private Sub SetText(ByVal [text] As String)
' InvokeRequired required compares the thread ID of the
' calling thread to the thread ID of the creating thread.
' If these threads are different, it returns true.
If Me.lboxResults.InvokeRequired Then
Dim d As New SetTextCallback(AddressOf SetText)
Me.Invoke(d, New Object() {[text]})
Else
Me.lboxResults.Items.Add([text])
End If
末次
很抱歉的VB代碼...
0
另一種選擇是使用的SynchronizationContext。這不僅適用於WinForms,也適用於WPF和ASP.NET,並且自.NET 2.0起可用。
在主線程(例如,在構造函數中)調用SynchronizationContext.Current,並在需要同步調用時使用返回的對象。如果對象爲空,則不需要同步。
相關問題
- 1. 如何判斷是否從JUnit調用?
- 2. 如何判斷屬性調用是否源自控制器與操作
- 3. 如何判斷數據庫是否需要在Android中升級?
- 4. imagemagick轉換:如何判斷圖像是否需要旋轉?
- 5. 如何判斷Mercurial拉出後是否需要合併?
- 6. 如何判斷我的元素是否需要innerHTML或值
- 7. 如何判斷oracle索引是否需要重建
- 8. 你如何判斷你是否需要釋放一個對象?
- 9. 動態對象 - 如何判斷屬性是否被定義?
- 10. 自我跟蹤pocos,如何判斷屬性是否已更改?
- 11. Android,BluetoothSocket - 如何判斷連接是否已經存在,或者是否需要調用連接?
- 12. 如何判斷Safari是否使用HTTP2?
- 13. 如何判斷AUCTeX是否可用?
- 14. 如何判斷是否使用EF5
- 15. 如何判斷用戶是否離線
- 16. 如何判斷是否使用glibc
- 17. 如何判斷soundmanager2是否使用html5?
- 18. 使用ARC是否NSMutableArray需要屬性?
- 19. 如何判斷一個URL參數是否需要用Java編碼
- 20. 如何判斷「ZipArchiveEntry」是否是目錄?
- 21. 判斷是否要刪除contentText
- 22. 如何判斷某個類中是否使用屬性或方法
- 23. 如何判斷EntityObject的屬性是主鍵還是外鍵?
- 24. 如何判斷一個屬性是否存在並且是假的
- 25. 如何判斷在XMLHTTPRequest上是否調用了「abort()」
- 26. 如何判斷net/http的ResponseWriter.Write()是否已被調用?
- 27. 如何判斷對system()的調用是否已退出?
- 28. 如何判斷一組Web服務調用是否完成?
- 29. 如何判斷我的動作是否由RenderAction調用?
- 30. 如何判斷DLL函數是否從VB6 exe被調用?
+1,你所尋找的方法(或屬性?)需要調用 – masfenix 2009-02-11 19:09:50