2010-09-10 3 views
0

je poser une question au sujet de la synchronisation dans un filetage multiple.synchronisation dans le filetage multiple en .net

J'ai une fonction appelée send que je fais appel dans une boucle pour chaque ligne de données.

Cette fonction crée des threads pour envoyer des courriels à des personnes différentes.

Public Sub send(ByVal Conn As Data.DataRow, ByVal job As Data.DataRow) MyThread = New Thread(AddressOf Me.start) MyThread.Start() End Sub

Mais chaque thread créé est en train d'écrire dans un fichier journal à différents points de temps. Il y a donc de fortes chances que 2 threads écrivent dans le même fichier en même temps. Alors, ai-je besoin d'utiliser n'importe quel type de mécanisme de synchronisation ici? ou est-ce bien sans eux? Si oui, quelqu'un peut-il me dire quoi utiliser et où l'utiliser?

Répondre

3

Pour éviter que plusieurs fils d'écrire en même temps, utilisez SyncLock. Par exemple, myLogFile est votre fichier journal:

SyncLock myLogFile 
    myLogFile.WriteLine("message"); 
End SyncLock 
-1

Vous aurez une erreur d'accès si un thread bloque le fichier parce qu'il est en train d'écrire à elle. Vous pouvez gérer l'exception, attendre le thread en cours, puis écrire dans le fichier.

boolean AttemptingToWrite = true 

while (AttemptingToWrite) 
try 
    WriteToLog() 
    AttemptinToWrite = false 
catch(ex as exception 
    system.threading.thread.sleep(100) 
end try 
end while 
+0

Haha, il est comme VB.NET et C# ont eu un bébé;) –

1

Plusieurs approches:

Votre fil peut obtenir un verrou sur votre objet enregistreur avant d'appeler les enregistreurs méthodes connectent. Cela fait que les appelants ont la responsabilité de verrouiller.

En option, vous pouvez déplacer la responsabilité de verrouillage dans l'objet de l'enregistreur en le faisant gérer le verrouillage. Voyez la réponse de Jim.

Si vous n'êtes pas d'emballer vos fonctions d'enregistrement dans un objet séparé puis créez simplement un objet dans votre code que vous pouvez verrouiller.

De plus, je ne serais pas frayer un fil par enregistrement, sauf si vous savez que vous aurez toujours un petit nombre d'enregistrements. Sinon, vous allez créer un changement de contexte et blesser perf. Regardez dans la méthode statique Thread.QueueUserWorkItem().