2010-01-02 57 views
0

燮傢伙,線程安全的方法調用不工作

我有我的frmMain類至極一個函數會更新我的控制到調用後別的東西。當我在即時窗口上鍵入「?Label1.Text」時,文本屬性IS會更新,但是當我去檢查窗體時,什麼也沒有發生。該代碼僅僅是這樣

Public Sub UpdateUI() 
    If (Me.InvokeRequired = True) Then 
     Invoke(New MethodInvoker(AddressOf UpdateUI)) 
    End If 
    Label1.Text = "ITS NOT WORKING =\" 
End Sub 

在我bgWorker類:​​

Private threadUpd As New Threading.Thread(AddressOf Updater) 
Private _active as Boolean 
Public Sub New() 
    _active = True 
    threadLimpar.IsBackground = True 
    threadLimpar.Start() 
End Sub 

Public Sub Updater() 
    Do 
     If (_active = False) Then 
      Try 
       Thread.Sleep(Timeout.Infinite) 
      Catch ex As ThreadInterruptedException 
      End Try 
     Else 
      if(condition...) then 
       frmMain.UpdateUI 
     End if 
    Loop 
End Sub 

回答

3

它是在VB.NET的經典陷阱,當他們開始使用線程每個人都落入它至少一次:

frmMain.UpdateUI 

現在我們看不到「frmMain」究竟是什麼意思。但是你發佈這個問題的事實表明frmMain是你的主要表單類的名字。不是您的班級中存儲對主窗體的引用的字段的名稱。

這是行不通的。 VB.NET編譯器生成的變量允許您像引用類一樣引用該變量,它具有<ThreadStatic>語義。換句話說,每個線程都將創建它自己的表單實例。你可以八九不離十看到它時,你寫這樣的:

frmMain.UpdateUI 
frmMain.Show 

但你會看到一個窗口的「鬼」,這是因爲它是在不抽創建線程門釘,否則死消息循環。

你需要一個真正的參考形式。如果Updater是表單類的方法,那可能是「我」。如果不是,Application.OpenForms可以提供它。最好的辦法是給包含Updater的類通過其構造函數引用表單。

+0

我幾乎可以肯定,這是這樣的,但你可以給我一個例子,我是如何引用我已經打開的表單? – Alex 2010-01-02 23:21:29

2

你或許應該終止函數,如果InvokeRequired返回true,但你無論如何設置標籤文本。這裏是你可以做什麼:

Public Sub UpdateUI() 
    If (Me.InvokeRequired = True) Then 
     Invoke(New MethodInvoker(AddressOf UpdateUI)) 
    Else 
     Label1.Text = "ITS NOT WORKING =\" 
    End If 
End Sub 
+0

希望我可以輸入更快,哈哈:D – Paolo 2010-01-02 22:49:54

+0

我很想因爲你在布爾和常量之間進行相等比較而陷入低谷,但是OP的問題做到了,所以無論如何我都會+1。使用布爾運算符。 – 2010-01-02 22:54:34

+0

嗯,我認爲我是一個愚蠢的原因,這個deffinitly不起作用,如我所說,我可以看到它被更新,如果我檢查立即窗口,但形式本身沒有更新。 任何其他提示 – Alex 2010-01-02 22:59:43

1

我想你想以下幾點:

Public Sub UpdateUI() 
    If (Me.InvokeRequired) Then 
     BeginInvoke(New MethodInvoker(AddressOf UpdateUI)) 
    Else 
     Label1.Text = "ITS NOT WORKING =\" 
    End If 
End Sub 
+0

仍然無法正常工作,表格上的標籤沒有更新,但是我可以看到它是通過即時窗口「更新」的 – Alex 2010-01-02 22:54:50

+0

繼續解決問題中的代碼時,此解決方案應更新標籤文本。 – 2010-01-02 22:56:14

+0

嗯,我認爲我是一個蠢蛋原因這deffinitly不起作用,本書雖然,正如我所說的,我可以看到,如果我檢查即時窗口也進行了更新,但形式本身沒有得到更新。任何其他提示? – Alex 2010-01-02 23:00:45