問題是這樣來了
鸚鵡在一個 Form 當中使用了一個自己寫的 Class Controller_A
Controller_A 再以多執行緒的方式用來控制其他的 Class Node_A, Class Node_B 到 Class Node_N
1 2 3 4 |
Dim node As NodeA Dim callback As Threading.WaitCallback = New Threading.WaitCallback(AddressOf node.SomeWork) Threading.ThreadPool.QueueUserWorkItem(callback) |
其中 Controller_A 會監聽 Node_N 的自定義事件,除了做各別處理外也會視需求觸發(RaiseEvent)自己的事件
Form 再監聽這些事件來控制 OvalShape 達到燈號的功能
但是當 Form 裡監聽事件的副程式嘗試變更 Form 上其他控制項時,就錯誤惹…
因為上一次使用 VB 來開發程式已經是 VB6.0時代了,所以只能慢慢爬官方文件
找到微軟 MSDN 關於 VB.NET 的委派(Delegates) 的相關說明,實在有點咬文嚼字讓我看了很久還是一樣看很不懂
爬文到最後自己好像有點懂了又還是不太懂 =.=
不過至少鸚鵡找到解決方法了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
Public Class frmMain Dim Controller As New Controller_A Public Sub New() AddHandler Controller.NodeStatusChanged, AddressOf Me.Ctrl_StatusChanged End Sub ' 宣告委派 Private Delegate Sub Ctrl_StatusChanged_CallBack(ByVal Args As String) ' Private or Public 自己視情況定義 Public Ctrl_StatusChanged(ByVal Args As String) ' InvokeRequired 取得一個值。這個值會指示是否由於呼叫端是在建立控制項之執行緒以外的執行緒 If Me.InvokeRequired Then Dim callback As New Ctrl_StatusChanged_CallBack(AddressOf Ctrl_StatusChanged) Me.Invoke(callback, Args) Exit Sub End If ' 真正要處理的工作 End Public End Class |
當 Ctrl_StatusChanged() 被 其他執行緒呼叫 或是 用來監聽其他執行緒觸發的事件 時會透過 Invoke() 委派的方式執行我們定義的委派 Ctrl_StatusChanged_CallBack()
然後直接跳出副程式
目前鸚鵡透過這樣的方式沒有在遇到 未處理的例外 了