So legen Sie eine maximale Zeit fest, für die eine C#-Funktion ausgeführt werden darf

So legen Sie eine maximale Zeit fest, für die eine C#-Funktion ausgeführt werden darf

Manchmal möchten wir eine maximal zulässige Zeit für eine Methode festlegen. Ein Beispiel ist, wenn unser Code mit einer externen Abhängigkeit kommuniziert, die nicht mehr reagiert, z. eine Datenbankverbindung oder ein Stück Hardware, das einfriert.

Lassen Sie uns ein Szenario erfinden, um dies weiter zu untersuchen.

Angenommen, ich habe eine Methode mit langer Ausführungszeit – diese dauert zufällig zwischen einer und zehn Sekunden, um eine Ganzzahl zurückzugeben.

private static int LongRunningMethod()
{
    var r = new Random();
 
    var randomNumber = r.Next(1, 10);
 
    var delayInMilliseconds = randomNumber * 1000;
 
    Task.Delay(delayInMilliseconds).Wait();
    
    return randomNumber;
}

Sagen Sie aber auch, dass ich nicht länger als maximal drei Sekunden warten möchte. Wie kann ich eine TimeoutException auslösen, nachdem ich drei Sekunden gewartet habe?

Aufgabe.Run zur Rettung

In .NET ist eine Aufgabe etwas, das Sie tun möchten. Es ist möglich, eine Funktion an die Run-Methode von Task zu übergeben, die diese Funktion asynchron in einem separaten Thread ausführt und ein Task-Objekt zurückgibt.

Na und? Nun, da ein Task-Objekt sofort von der Task.Run-Methode zurückgegeben wird, können wir die Wait-Methode der Task aufrufen und drei Sekunden warten, bis die Aufgabe abgeschlossen ist. Wenn es erfolgreich abgeschlossen wurde, gibt diese Methode true zurück. Wenn es nicht abgeschlossen ist, wird false zurückgegeben. So können wir die Ausgabe testen und eine Ausgabe zurückgeben, je nachdem, was wir tun möchten.

var task = Task.Run(() =>
{
    return LongRunningMethod();
});
 
bool isCompletedSuccessfully = task.Wait(TimeSpan.FromMilliseconds(3000));
 
if (isCompletedSuccessfully)
{
    return task.Result;
}
else
{
    throw new TimeoutException("The function has taken longer than the maximum time allowed.");
}

Dieses Muster kann verwendet werden, um die Leistung meines Codes zu verbessern – es stellt sicher, dass ich, wenn meine Anwendung aus irgendeinem Grund gesperrt wird, weiß, dass ich die maximale Zeitspanne, für die sie gesperrt wird, kontrollieren kann.