7 Stimmen

Effiziente parallele Auswertung von foreach child

Ich habe eine Liste von Objekten, jedes mit einer bool ShouldRun()-Methode auf sie.

Ich durchlaufe derzeit die Liste der Objekte, prüfe ShouldRun() für jedes Objekt und rufe Run() für das erste Objekt auf, das true zurückgibt

foreach (child in Children)
{
   if (child.ShouldRun())
   {
      child.Run();
      break;
    }
 }

Ich würde dies gerne parallel tun, da die Auswertung von shouldRun ziemlich viel Zeit in Anspruch nehmen kann und es von Vorteil ist, wenn spätere Elemente in der Sammlung früh mit ihrer Auswertung beginnen.

Mir fällt jedoch kein Weg ein, der diese Bedingungen erfüllt:

1 Nur einen Artikel ausführen

2 Ein späteres Element nicht ausführen, wenn ein früheres Element wahr ist oder die Auswertung noch nicht abgeschlossen ist

3 Wenn alle "früheren" Elemente "false" zurückgegeben haben und ein mittleres Element "true" zurückgibt, warten Sie nicht auf ein späteres Element, um die Auswertung zu beenden, weil Sie wissen, dass es nichts früheres außer Kraft setzen kann.

Ich dachte an eine parallele "wo" linq-Abfrage zu tun, um alle Elemente abzurufen, die shouldRun() und dann sortieren, aber dies wird Bedingung #3 verletzen

Ideen?

Hintergrundinformationen :

Das System ist für ein allgemeines Robotik-KI-System bestimmt.

Einige der Aufgaben mit höherer Priorität können durch sofort bekannte Sensorvariablen ausgelöst werden, z.B.: Ich falle um, repariere es!

andere Aufgaben könnten rechenintensiv sein (Bilderkennung von der Kamera und Annäherung an sichtbare Ziele)

andere Aufgaben können datenbank- oder ferngesteuert sein (eine Liste wahrscheinlicher Zielorte aus einer Datenbank abrufen und dann dorthin navigieren, um zu sehen, ob man in Sichtweite eines dieser Orte gelangen kann)

Einige der Aufgaben selbst haben untergeordnete Aufgaben, was im Wesentlichen dazu führt, dass dieser Prozess rekursiv bei einer Teilmenge von Aufgaben beginnt, und die Enkelaufgabe wird durch die Kette nach oben weitergereicht

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