Announcement

Collapse
No announcement yet.

Funktion nach einer bestimmten Zeit abbrechen!!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Funktion nach einer bestimmten Zeit abbrechen!!

    Hallo Leute,

    ich habe eine Funktion A, die eine Funktion B aufruft. In dieser Funktion B ist ein kritischer Aufruf. Nun möchte ich die Ausführungszeit für Funktion B auf 5 Sekunden beschränken. D.h. wenn die Ausführungszeit von Funktion B größer als 5 Sekunden ist, soll die Funktion nach 5 Sekunden abgebrochen werden. Wie könnte ich sowas realisieren. Bin für jede Antwort dankbar.

    Gruß moojoe

  • #2
    Hallo,

    lagere Methode B in einen Thread aus und warte in Methode A auf das TimeOut. Wenn B dann noch nicht fertig brich B ab (oder teile B mit dass es beendet werden soll, ist nicht so brutal).

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Funktion B in einen Thread packen und den nach 5 Sekunden abbrechen wenn der denn noch nicht zu Ende ist. Ob und wie der zu beenden ist hängt aber davon ab was genau in Funktion B passiert. Nicht jede Funktionalität kann einfach so abgebrochen werden.

      Comment


      • #4
        Wie setze ich ein Timeout bei einem Thread, so dass er noch max. 5 Sekunden beendet wird?

        Comment


        • #5
          Unausgereiftes Beispiel:

          [highlight=c#]
          using System.Threading;

          namespace ConsoleApplication1
          {
          class Program
          {
          static void Main(string[] args)
          {
          // A aufrufen:
          A();
          }

          static void A()
          {
          Thread workerThread = new Thread(B);
          workerThread.Start();
          Thread.Sleep(5000);
          if (workerThread.IsAlive)
          workerThread.Abort();
          }

          static void B()
          {

          }
          }
          }
          [/highlight]

          mfG Gü
          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

          Comment


          • #6
            Das würde ja bedeuten, dass die Funktion A auf jedenfall 5 Sekunden wartet und dann schaut ob der Thread schon durch ist oder nicht. Normal dauert die Abarbeiteung der Funktion B bei mir aber nur Milisekunden. Gibt es evt. eine Möglichkeit das der Thread nach 5 Sekunden beendet wird, wenn er noch nicht fertig ist und wenn der Thread durch ist, z.Bsp. nach 200Milisekunden, das es dann direkt weiter geht? Danke für die super schnelle Hilfe...

            Comment


            • #7
              Geth auch.

              [highlight=c#]
              using System;
              using System.Threading;

              namespace ConsoleApplication1
              {
              class Program
              {
              /// <summary>
              /// Wird zur Threadbenachrichtigung benötigt.
              /// </summary>
              private static AutoResetEvent _signal = new AutoResetEvent(false);

              static void Main(string[] args)
              {
              // Starten von A:
              A();
              Console.WriteLine("Fertig.");
              Console.ReadKey();
              }

              static void A()
              {
              Thread workerThread = new Thread(B);
              workerThread.Start();

              // Timer starten der 5 Sekunden wartet und dann das Signal
              // setzt.
              new Timer((o) => { _signal.Set(); }, null, 5000, Timeout.Infinite);

              // Warten bis B fertig ist bzw. das Signal gesetz ist:
              _signal.WaitOne();

              // Prüfen ob B noch arbeitet:
              if (workerThread.IsAlive)
              workerThread.Abort();
              }

              static void B()
              {
              Console.WriteLine("In B");
              // Arbeit von B simulieren:
              Thread.Sleep(2000);

              Console.WriteLine("B fertig.");

              // Benachrichtigen dass B fertig ist:
              _signal.Set();
              }
              }
              }
              [/highlight]

              Erklärung kann ich jetzt keine geben (zu weig Zeit) aber wenn du was wissen willst frag nach.

              mfG Gü
              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

              Comment


              • #8
                Das ganze geht auch mit ThreadPool.

                Vergleich von ThraedPool und Thread ist hier.

                Der Vorteil in der hier gezeigten Variante ist dass die Methode B nicht geändert werden muss um sie in einem Thread oder ohne Thread zu verwenden. Das finde ich einen großen Vorteil (ähnlich wie bei der Datenbindung die UI und die Businessschicht getrennt werden soll(te)).

                Anmerkung: Wenn in B eine Schleife verwendet wird sollte der Thread nicht per Abort beendet werden sonder so wie in diesem Beispiel beschrieben.

                [highlight=c#]
                using System;
                using System.Threading;

                namespace ConsoleApplication1
                {
                class Program
                {
                static void Main(string[] args)
                {
                // Starten von A:
                A();
                Console.WriteLine("Fertig.");
                Console.ReadKey();
                }

                static void A()
                {
                // Wird zur Threadbenachrichtigung benötigt:
                AutoResetEvent signal = new AutoResetEvent(false);

                // Wird benötigt da ThreadPool verwendet wird:
                Thread workerThread = null;

                ThreadPool.QueueUserWorkItem((o) =>
                {
                // ThreadPool-Thread können normalerweise nicht
                // zugegriffen werden. Mit diesem "Trick" gehts.
                workerThread = Thread.CurrentThread;

                // B starten:
                B();

                // Benachrichtigen dass B fertig ist:
                signal.Set();
                });

                // Timer starten der 5 Sekunden wartet und dann das Signal
                // setzt.
                new Timer((o) => { signal.Set(); }, null, 5000, Timeout.Infinite);

                // Warten bis B fertig ist bzw. das Signal gesetz ist:
                signal.WaitOne();

                // Prüfen ob B noch arbeitet:
                if (workerThread != null && workerThread.IsAlive)
                workerThread.Abort();
                }

                static void B()
                {
                Console.WriteLine("In B");
                // Arbeit von B simulieren:
                Thread.Sleep(200000);

                Console.WriteLine("B fertig.");
                }
                }
                }
                [/highlight]

                mfG Gü
                Zuletzt editiert von gfoidl; 23.06.2009, 21:43.
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment

                Working...
                X