Forum: PC-Programmierung C# Ablaufabbruch Konzept


von Thorsten (Gast)


Lesenswert?

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.

von Uwe (Gast)


Lesenswert?

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);
       }
}

von Thorsten (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.