Laden...

Ein BackgroundAction-Pool

Erstellt von DeZio vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.889 Views
DeZio Themenstarter:in
76 Beiträge seit 2008
vor 10 Jahren
Ein BackgroundAction-Pool

Beschreibung:

Ich arbeite derzeit an einer Bibliothek, die einen Pool zur sequenziellen Abarbeitung von gleichen Folgen anbietet. Der Pool wird alle Aktionen hintereinander ausführen, sobald Run(); aufgerufen wurde.
Eine Parallelisierung soll demnächst folgen.

**Vorgehensweise zum Verstehen des Projekts:**Man erstellt ein Objekt "BackgroundAction<TParam, TResult>".
TParam ist dabei der Typ, der als Übergabeparameter an die Methode übergeben wird.
TResult ist der Typ, der die Methode zurückgibt.

So kann man z.B. eine Massenverarbeitung von Bildern (Thumbnail-Creating) einfach in einen anderen Thread ausgelagert werden.

Jede Aktion triggert ein Event, das das Resultat (return) der Methode besitzt. Das ermöglicht, die Thumbnails z.B. in einer Form direkt anzuzeigen.

Beispiel zu einer Abfolge, die true oder false ausgibt:
Kann zum Beispiel verwendet werden, um eine Datenbank zu installieren, mehrere Dateien aus dem Internet herunterzuladen, usw.
False soll ausgegeben werden, wenn die Aktion eine Exception geworfen hat. Diese kann dann im OnDone-Event verarbeitet werden. Achtung: Nicht im Beispiel implementiert.
Assert.IsNotTrue(e.Success == true);


class VariousActionWithResult : BackgroundTask.BackgroundAction<Action, bool> {
   /* Standard-Konstruktoren */
}
class ActionSuccessPool : BackgroundTask.BackgroundActionPool<Action, bool> {
} 

private IEnumerable<VariousActionWithResult> CollectThingsToDo() {
    List<VariousActionWithResult> ret = new List<VariousActionWithResult>();
            
    // generate actions
    var openDb = new VariousActionWithResult(Do, DummyAction)
        {
            StatusText = "Opening database"
        };
	/* ... */
    ret.AddRange(new List<VariousActionWithResult>()
        {
            openDb,
            /* ... */
        });
    return ret;
}


// Beispielcode
ActionSuccessPool pool = new ActionSuccessPool();
foreach (var actionToDo in CollectThingsToDo()) {
   actionToDo.OnDone += actionToDo_OnDone;
   pool.Add(actionToDo, actionToDo.StatusText);
} // foreach end
pool.OnNextProgress += pool_OnNextProgress;
pool.OnAllDone += pool_OnAllDone;
pool.Run();
WaitAllDone.WaitOne();


Ich bin mir bewusst, dass das .Net Framework 4.0 ebenfalls eine Möglichkeit bietet, solche Algorithmen zu lösen. Doch ich wollte einen Pool haben, der weiter ausgebaut werden soll.

Projekt-URL: https://backgroundactionpool.codeplex.com/

Das Projekt wurde auf CodePlex hochgeladen und im Laufe der Woche weiter aktualisiert; mit eigenen Verbesserungen und euren Verbesserungsvorschlägen.

Wenn jemand Lust hat, aktiv mitzuarbeiten, gerne!

Schlagwörter: Task-Pool, Pool, Threading, Tasks mit Result