Je rencontre un peu de difficulté en utilisant la classe threadpool et un tableau de ManualResetEvents. Voici un exemple simple de ce que je fais. Le problème est que dans la méthode DoWork j'obtiens des références nulles à l'objet resetEvent [param as int].C# Threadpool Synchronization Inquiry
Je n'arrive pas à comprendre ce que je fais de mal.
(edit: a obtenu le fonctionnement du bloc de code)
private static volatile ManualResetEvent[] resetEvents = new ManualResetEvent[NumThreads];
public void UpdateServerData()
{
for (int i = 0; i < NumThreads ; i++)
{
resetEvents[i] = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork), (object) i);
}
WaitHandle.WaitAll(resetEvents);
}
private void DoWork(object param)
{
//do some random work
resetEvents[(int)param].Set();
}
EDIT: J'ai essayé d'insérer un System.Threading.Thread.MemoryBarrier(); après chaque .Set() cependant j'obtiens toujours une exception de référence nulle.
J'ai effectué plusieurs modifications pour que le bloc de code fonctionne. Si quelqu'un a vu les itérations précédentes, excusez le gâchis que c'était. – Setheron
J'ai également essayé de verrouiller chaque appel .Set() parce que cela devrait provoquer une lecture/écriture volatile de l'objet mais cela ne semble pas fonctionner non plus. Très frustrant. – Setheron
Pourquoi diable établissez-vous une barrière de mémoire * après * le 'Set()'? Vous devez voir l'élément de tableau mis à jour * avant * que vous appelez 'Set()' dessus! –