5 Stimmen

Warum werden diese Aufgaben nacheinander ausgeführt?

Warum wird der folgende Code sequentiell ausgeführt?

List tasks = new List();

for (int i = 0; i <= max; i += block)
{
    if (i + block >= max)
        tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));
    else
        block = max - i;
}

Task.WaitAll(tasks.ToArray());

Ich habe auch eine Version davon mit Parallel.Invoke getestet; auch diese wird nicht parallel ausgeführt. Es muss etwas geben, das ich nicht verstehe, aber wenn ich danach google, erhalte ich hauptsächlich Anleitungen, wie man sequentielle Ausführung erzwingt.

Als Antwort auf eine der Vorbehalte in einer untenstehenden Antwort, habe ich die folgende Methode zur Referenz hinzugefügt:

static void Count(ref int counter, int num)
{
    int localCounter = 0;
    for (int i = 0; i < num; i++)
        if (Coin()) localCounter++;
    System.Threading.Interlocked.Add(ref counter, localCounter);
}

Erneut bearbeitet: Vielen Dank an alle!

4voto

I4V Punkte 34751

Ersetzen Sie einfach tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block))); durch Console.WriteLine und debuggen Sie Ihren Code.

Sie erstellen nie mehr als eine Aufgabe.

for (int i = 0; i <= max; i += block)
{
    if (i + block >= max)
        Console.WriteLine(i);
    else
        block = max - i;

}

1voto

Servy Punkte 197305

Warum wird der folgende Code sequentiell ausgeführt?

Das passiert nicht, es sei denn, dass innerhalb der Count-Methode etwas ist, das den Zugriff auf eine einzelne Ressource synchronisiert. Wenn es parallelisiert werden kann, wird es parallel ausgeführt.

Wenn Count sehr schnell ausgeführt wird, werden Sie feststellen, dass die Aufgaben schneller abgeschlossen sind als neue Aufgaben geplant werden, weshalb sie möglicherweise alle in der Reihenfolge ausgeführt werden.

1voto

Trisped Punkte 5458

Es scheint mir, dass etwas mit deiner Schleifen-/If-Anweisung nicht stimmt:

for (int i = 0; i <= max; i += block)
{
    if (i + block >= max)
        tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));
    else
        block = max - i;
}

Wenn ich es richtig lese, fügst du nur eine Aufgabe hinzu, wenn i + block >= max ist, und du wirst nur eine Schleife durchlaufen, wenn i + block <= max ist (das Zählen und Bedingungsüberprüfung zeigt). In diesem Fall fügst du also nur einmal eine Aufgabe hinzu.

Zusätzlich änderst du den Block, wenn du keine Aufgabe hinzufügst. Ich vermute, du möchtest eher etwas wie das Folgende, obwohl ich ohne mehr Code nicht sicher sein kann:

for (int i = 0; i <= max; i += block)
{
    tasks.Add(Task.Factory.StartNew(() => Count(ref counter, block)));
    if (i + block >= max) { block = max - i; }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X