C# Ablaufabbruch Konzept

Gast #4462483
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.
Gast #4464970
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);
       }
}
Gast #4466493
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.