Ich habe Schwierigkeiten zu verstehen, warum das Multithreading keine Werte aktualisieren kann, bevor der Thread abgeschlossen ist. Hat der separate Thread eine eigene Kopie der Referenzen oder Werte?
Multithreading-Problem beim Aktualisieren des Werts
Wenn nicht, nach meinem Verständnis der Code unten sollte ordnungsgemäß funktionieren, wenn MyMethod genannt wird, aber oft ist es nicht Instanzen einiger MyType Objekte im Array erstellen, bevor die thread.IsAlive
wird false:
class MyClass
{
static MyType[] obj = new MyType[Environment.ProcessorCount - 1];
void MyMethod()
{
Thread[] threads = new Thread[Environment.ProcessorCount - 1];
for (int i = 0; i < Environment.ProcessorCount - 1; i++)
{
threads[i] = new Thread(() => FillObjects(i));
threads[i].Priority = ThreadPriority.AboveNormal;
threads[i].Start();
}
while (threads[i].Any(c => c.IsAlive))
{
Thread.Sleep(50);
}
}
void FillObjects(int i)
{
obj[i] = new MyType();
//perform actions with obj[i] to fill it with necessary values
}
}
Guter Punkt. Wenn die erste Anweisung in 'FillObjects()' ein 'Thread.Sleep (1000) 'wäre, wäre wahrscheinlich nur' obj [Environment.ProcessorCount - 1] 'nicht null, weil die Schleife" i "bis zu ihrem Endwert inkrementiert hätte bevor das erste Objekt erstellt wird. Wenn man darüber nachdenkt, kann FillObjects() werfen, weil "i" tatsächlich in "Environment.ProcessorCount-1" inkrementiert wird, bevor die Schleife beendet wird und somit außerhalb von "obj" liegt. –
Vielen Dank für die Antwort, in der Tat war das eines der Hauptprobleme, jetzt instanziiert es die Objekte richtig. Der Thread führt jedoch nicht alle Vorgänge ordnungsgemäß durch, bevor er beendet wird, und zwar nach dem Zufallsprinzip. Irgendwelche Vorschläge? – Almis
Ich habe meinen eigenen logischen Fehler gefunden, jetzt funktioniert es richtig. – Almis