2009-04-11 6 views
0

Je suis en train d'écrire un programme serveur qui fait un peu de threading de base. Il a besoin de mettre à jour certains contrôles de l'interface utilisateur et j'ai appris à utiliser les délégués de manière à ce que tout soit sécurisé. Par exemple, voici mon délégué qui me permet de mettre à jour un contrôle TextBox d'un fil:Mettre à jour le compteur sur le thread dans .NET

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 

Maintenant je dois mettre à jour un compteur et je me suis dit le même schéma s'appliquerait. J'ai mis en place le délégué suivant:

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 

Le problème est que mon compteur n'est pas incrémenté. Lorsque je trace cela avec le débogage, l'instruction "ctr + = 1" est exécutée mais le compteur réel reste à zéro. Je pense que je devrais passer le compteur par référence.

Quelqu'un peut-il donner des conseils ici? Merci!

\ cbf

Répondre

1

Un fil de manière sûre pour incrémenter un nombre entier qui peut être réalisé en utilisant System.Threading.Interlocked.Increment. Vous devriez utiliser ceci et éviter le délégué.

Modifier

Je ne sais pas pourquoi vous essayez d'utiliser un délégué. Votre incrémentation d'un objet de valeur qui peut être fait sur n'importe quel thread. Vous ne pouvez pas mettre à jour les contrôles d'interface utilisateur à partir d'autres threads.

Si vous tentez de sécuriser les threads, vous devez introduire le verrouillage à l'aide d'un moniteur (par exemple) ou en utilisant la méthode Increment verrouillé.

1

Vous passez le compteur en valeur, alors ctr += 1 incrémente l'argument de la fonction. Vous devez passer le compteur par référence, ou simplement incrémenter un champ privé avec InterlockedIncrement - aucun délégué ou invoquer requis.

Questions connexes