Hallo, eigentlich ist es keine explizite Frage zu C#, aber weil es meine momentane Programmiersprache möchte ich es zur Sicherheit erwähnen. In meinem Programm steuer ich ein externes Gerät an und teste verschiedene Funktionen ab, dazu hab ich eine Methode welche den Testablauf ausführt, dieser Testablauf wird in einer Schleife mit unterschiedlichen Parametern wiederholt, natürlich werden die Ergebnisse nach jedem Durchlauf in einen Report geschrieben. Der Testablauf wird in einen seperaten Task gestartet, damit die UI für den Anwender frei verfügbar bleibt und verschiedene Labels werden mit den Zwischenergebnissen gefüllt, soweit funktioniert es auch zufriedenstellend. Mich stört es nur, dass ein kompletter Testablauf beim Abbrechen durchlaufen wird, weil ich in der For-Schleife den Userabbruch polle. Ich könnte natürlich in den Testablauf selber die Userabbruchbedingung in den verschiednenen Ausführungen immer wieder pollen, aber schön finde ich die Lösung nicht. Wie handhabt Ihr das für eure Programme, insbesondere bezogen auf Ansteuerung von externen Geräten, welche sich mechanisch bewegen? Notausschalter um die beweglichen Teile vom Stromnetz zu trennen bzw. bei der Bewegung zu unterbrechen gibt es natürlich, trotzdem interessiert mich ein Konzept parallel in Software.
Du hast die Frage schon beantwortet: Solange die Schleife mit den Testläufen in einem eigenem Task läuft, hast du erstmal keine Möglichkeit in der Applikation auf Benutzerabbrüche zu reagieren. Was du machen könntst wäre, eine eigene Testlauf Klasse zu schreiben, die ungefähr so ausschauen könnte. (Vorsicht, habe das eben so hingeschrieben) class Testlauf : Runnable { public delegate void NotificationDelegate(int? taskId, boolean interrupted); public event NotificationDelegate NotifyInterrupted; public void Run() { try { //hier deine tests durchführen } catch { //ups } } private void UserAction() { //Benutzer bricht Test ab NotifyInterrupted(Task.CurrentId, true); } class TestProgramm { private static boolean interruptTestRun; public static void Main() { for (int i = 0; i < 5; i++)//5 testläufe { Testlauf tb = new Testlauf(); tb.NotifyCompletion += Testlauf.NotificationDelegate(tb_NotifyCompletion); Task.Factory.StartNew(tb); if(interruptTestRun) break; } } static void tb_NotifyCompletion(int? taskId, boolean interrupted) { interruptTestRun = interrupted; Console.WriteLine("Task with id interupted =" + taskId); } }
Hallo, danke für deine Antwort. Ich hab es nun etwas anders gelöst und zwar mittels Task.Run und Cancellationtoken, sowie Continuewith. Ganz fein ist auch gleich die Einbindung für delegats, damit man direkt auf die UI zugreifen kann.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.