4 Stimmen

c# - Abbruch der Ausführung einer Methode, wenn die Ausführung zu lange dauert

Wie kann ich die Ausführung einer Methode abbrechen, wenn ihre Ausführung zu lange dauert?

z.B..

string foo = DoSomethingComplex();

aber wenn DoSomethingComplex() zu lange dauert (sagen wir 20 Sekunden). dann setzen Sie foo einfach auf "";

6voto

triazotan Punkte 2182

Sie können dann einen neuen Thread erstellen, in dem Ihre Methode ausgeführt wird:

thread.Start();
bool success = thread.Join(20000);

Join gibt true zurück, wenn der Thread vor der angegebenen Zeit erfolgreich beendet wurde. Offensichtlich wird die Methode nicht abgebrochen (wahrscheinlich gibt es keine Möglichkeit, die dass direkt), sondern den Faden - aber es scheint, dass dies das Gewünschte erreichen würde.

Ein einfaches Beispiel für einen Threading-Code würde wahrscheinlich wie folgt aussehen. Beachten Sie, dass ich einige Annahmen über Signatur mit Parameter, all dies in einer Klasse, etc. Für Methode:

    public string DoSomethingComplex(int param)

und dann in der gleichen Klasse:

public delegate void Callback(string newFoo);

public void ThreadedDoSomethingComplexEnded(string newFoo)
{
    foo = newFoo;
}

private static void ThreadedDoSomethingComplex(ClassFooIsIn fooObject, int param, Callback callback)
{
    var newFoo = fooObject.DoSomethingComplex(param);
    callback(newFoo);
}

Verwendung aka Code in einer anderen Methode in ClassFooIsIn:

var thread = new Thread(() => ThreadedDoSomethingComplex(this, param, ThreadedDoSomethingComplexEnded));
thread.Start();

if (!thread.Join(20000))
{
     foo = "";
}

Foo sollte vor der oben gezeigten Verwendung initialisiert werden, so dass man in Wirklichkeit die Zeile foo = ""; überspringen könnte.

1voto

Erstellen Sie einen separaten Thread für DoSomethingComplex und warten Sie auf den Abschluss des Vorgangs im Hauptthread:

  1. erzeugen eine Instanz von AutoResetEvent und übergibt es an den Thread, der DoSomethingComplex ausführen wird;
  2. Verwendung der Methode AutoResetEvent.Set() in DoSomethingComplex, um den Hauptthread über den Abschluss zu informieren
  3. AutoResetEvent.WaitOne(timeout) im Hauptthread verwenden
  4. Wenn WaitOne false zurückgibt, verwenden Sie Thread.Abort() Methode, um den Thread zu stoppen, wenn er zu lange läuft.

0voto

Darin Dimitrov Punkte 990883

Sie können nicht Abbrechen die Ausführung einer Methode. Sie könnten diese Methode in einem separaten Thread ausführen und den Thread abbrechen, wenn er zu lange dauert.

0voto

Martin Ongtangco Punkte 20577

Recherchen zu LiMex oder Limited Execution.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X