Ich habe ein wenig Schwierigkeit mit der threadpool Klasse und einem Array von ManualResetEvents. Unten ist ein einfaches Beispiel für das, was ich mache. Das Problem ist, dass ich in der DoWork-Methode NULL-Referenzen auf das resetEvent [param as int] -Objekt bekomme.C# Threadpool Synchronisation Anfrage
Kann mir nicht vorstellen, was ich falsch mache.
(edit: got der Codeblock Arbeits)
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: Ich habe versucht, eine System.Threading.Thread.MemoryBarrier Einfügen(); Nach jedem .Set() bekomme ich jedoch immer noch eine Null-Referenz-Ausnahme.
Ich hatte mehrere Änderungen vorgenommen, um den Code-Block arbeiten zu lassen. Wenn jemand die früheren Iterationen gesehen hat, entschuldigen Sie die Unordnung, die es war. – Setheron
Ich habe auch versucht, jeden Aufruf von .Set() zu sperren, weil das ein flüchtiges Lesen/Schreiben des Objekts verursachen sollte, das aber auch nicht zu funktionieren scheint. Sehr frustrierend. – Setheron
Warum in aller Welt geben Sie eine Speicherbarriere * nach * dem 'Set()' aus? Sie müssen das aktualisierte Array-Element * sehen, bevor Sie 'Set()' darauf aufrufen! –