Bonjour.
J'ai un problème avec le multithreading.
Je développe un service Windows qui va aller se connecter à n clients pour leur envoyer une commande.
Pendant mes premiers tests, quand j'avais peu de clients connectés, tout allait bien. Mais maintenant que j'ai environ 200 clients, ca ne marche plus.
Voici le fonctionnement actuel :
J'ai un thread qui effectue un foreach sur la liste des clients connectés.
Dans ce foreach, j'instancie un ManualResetEvent (situé dans un tableau), et j'appelle la fonction qui va faire la connection et tout par un ThreadPool.
Et ensuite j'attends que tous les manualResetEvent soient signalés pour continuer :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 For Each c In ListeClients manualEvents(i) = New ManualResetEvent(False) Dim _args As New List(Of Object) _args.Add(strProgName) _args.Add(strArgs) _args.Add(stream) _args.Add(broadcastID) _args.Add(c) _args.Add(manualEvents(i)) ThreadPool.QueueUserWorkItem(AddressOf SendCommandThread, _args) Trace.WriteLine("Created", "ThreadpoolCommand") i += 1 Next
Le problème, c'est que WaitAll ne peut pas prendre en paramètre un tableau de plus de 64 manualResetEvents. D'où mon bug...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 If WaitHandle.WaitAll(manualEvents) Then Trace.WriteLine("End", "ThreadpoolCommand") Return CHAR_ACK Else Return CHAR_NACK End If
Auriez-vous une idée pour que je puisse contourner cette limitation ?
Merci !
Partager