Schichtenarchitektur, BackgroundWorker

steff aka sId

Erfahrenes Mitglied
Also folgendes Problem:
Ich bin gerade daran eine Software zu schreiben, die auf einer 3 Schichten Architektur basiert. Jetzt habe ich eine Berechnung, die über die Gui gestartet wird (ziehen einer Kubikwurzel aus einer sehr großen Zahl die bis zu 3072 Bit groß sein kann). Wer jetzt sagt wieso benutzt du so große Zahlen, ganz einfach weil es sich dabei um die Darstellung eines Implementierungsfehlers in einigen RSA-Klassenbibliotheken handelt und RSA Schlüssel heut zutage nunmal so groß sein können.
Aber zurück zum eigentlichen Problem. Die Berechnung an sich starte ich über einen BackgroundWorker was mir so auch ganz gut gefällt. Aber was nicht so toll ist, ist dass wenn ich jetzt den worker canceln will ich den DoWorkEventArgs Parameter, durch meine Schichten und Klassen schleusen muss, da ich ja um abzubrechen, dass darin enthaltene Flag cancel abfragen muss. Gibt es dafür eine andere Lösung (vieleicht über Events!)? Oder hat jemand eine bessere Idee? Vieleicht hab ich da ja auch irgend etwas nicht ganz richtig verstanden...

Hoffe ihr versteht was ich meine.

vG Steffen
 

Norbert Eder

Erfahrenes Mitglied
In welcher Schicht läuft der Backgroundworker? Vermutlich in der UI. In der Methode DoWork wird vermutlich mit einer Klasse aus der Businessschicht gearbeitet, oder? Damit hättest du quasi deine Businessklasse ohnehin in der UI und müsstest gar nicht durch irgendwelche Schichten ...

Oder hast du den BackgroundWorker gewrappt und damit liegt er in der Businessschicht und die dort aufgerufene Klasse ebenfalls? Dann kannst du alles in der Businessschicht abfackeln ...

Vielleicht gibst du einfach ein wenig mehr Informationen über deinen Aufbau und in welcher Schicht was genau zu finden ist. Sonst wird es ein Ratespiel ...
 

steff aka sId

Erfahrenes Mitglied
Sry, länger nicht mehr hier rein geschaut.
Ja richtig der Backgroundworker liegt in der UI und die aufgerufene Klasse/ Methode stammt aus der Businessschicht. D.h. wenn ich eine Aktion des Backgroundworkers abbrechen will, muss ich entsprechend den EventParameter des BackgroundWorkders meiner Businessklasse zur Verfügung stellen, damit diese auch die Verarbeitung abbricht, wenn ich das cancel Flag am BackgroundWorkder setze.

vG Steffen
 

Norbert Eder

Erfahrenes Mitglied
Nicht zwingend.

Ich gehe davon aus, dass der Benutzer deiner Software über die UI die Verarbeitung abbrechen kann? Hier hast du bezüglich des BackgroundWorkers noch keine Probleme, da du diesem den Abbruch ja mitteilen kannst.

Nun arbeitest du in deinem BackgroundWorker mit einem eigenen Objekt, welches die Aufgabe durchführt. Diesem verpasst du einen Methode Cancel, die den Abbruch vornimmt. Somit sind die Teile auch sauber getrennt, da du beim Abbruch des BackgroundWorkers nur die Cancel-Methode deines Businessobjektes aufrufen musst. Fertig.