2009-04-11 2 views
0

Ich schreibe ein Server-Programm, das einige grundlegende Threading ausführt. Es muss einige UI-Steuerelemente aktualisieren und ich habe gelernt, Delegaten zu verwenden, so dass alles threadsicher ist. Zum Beispiel, hier ist mein Delegat, der mir ein Textboxsteuerelement von einem Thread aktualisieren können:Zähler auf Thread in .NET aktualisieren

Private Delegate Sub AddMessageToTXTDelegate(ByVal lst As TextBox, ByVal str1 As String) 
Private Sub AddMessageToTXT(ByVal txt As TextBox, ByVal str1 As String) 
    Try 
     If Me.InvokeRequired Then 
      Dim addTXT As New AddMessageToTXTDelegate(AddressOf AddMessageToTXT) 
      Me.BeginInvoke(addTXT, New Object() {txt, str1}) 
     Else 
      txt.Text = str1 
     End If 
    Catch ex As Exception 
     Console.WriteLine(ex.Message) 
     Throw (ex) 
    End Try 
End Sub 

Jetzt muss ich einen Zähler aktualisieren und ich dachte, das gleiche Muster gelten würde. Ich setzte den folgenden Delegierten zusammen:

Private Delegate Sub IncrementCounterDelegate(ByVal ctr As Integer) 
Private Sub IncrementCounter(ByVal ctr As Integer) 
    Try 
     If Me.InvokeRequired Then 
      Dim incCtr As New IncrementCounterDelegate(AddressOf IncrementCounter) 
      Me.BeginInvoke(incCtr, New Object() {ctr}) 
     Else 
      ctr += 1 
     End If 
    Catch ex As Exception 
     Console.WriteLine(ex.Message) 
     Throw (ex) 
    End Try 
End Sub 

Das Problem ist, dass mein Zähler nicht inkrementiert wird. Wenn ich dies mit Debug verfolgen, wird die Anweisung "ctr + = 1" ausgeführt, aber der tatsächliche Zähler bleibt auf Null. Ich denke, ich sollte den Zähler als Referenz weitergeben.

Kann jemand hier einen Rat geben? Vielen Dank!

\ CBF

Antwort

1

Ein Thread sichere Weise eine ganze Zahl inkrementieren kann mit System.Threading.Interlocked.Increment erreicht werden. Sie sollten dies verwenden und den Delegierten vermeiden.

bearbeiten

Ich bin nicht sicher, warum Ihr einen Delegierten zu verwenden versuchen. Das Inkrementieren eines Wertobjekts, das in einem beliebigen Thread ausgeführt werden kann. Sie können UI-Steuerelemente von anderen Threads nur nicht aktualisieren.

Wenn Sie versuchen, diesen Thread sicher zu machen, müssen Sie das Sperren mithilfe eines Monitors (als ein Beispiel) oder mithilfe der Interlocked-Increment-Methode einführen.

1

Sie übergeben den Zähler nach Wert, sodass ctr += 1 das Argument der Funktion inkrementiert. Sie müssen den Zähler als Referenz übergeben oder nur ein privates Feld mit InterlockedIncrement inkrementieren - keine Delegaten oder Aufrufe erforderlich.

Verwandte Themen