Come impostare un tempo massimo per l'esecuzione di una funzione C#

Come impostare un tempo massimo per l'esecuzione di una funzione C#

A volte vorremmo impostare un tempo massimo consentito per un metodo. Un esempio è quando il nostro codice comunica con una dipendenza esterna che smette di rispondere, ad es. una connessione al database o un componente hardware che si blocca.

Inventiamo uno scenario per esaminarlo ulteriormente.

Supponiamo di avere un metodo di lunga durata:questo richiede casualmente da uno a dieci secondi per restituire un numero intero.

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

Ma dì anche che non voglio aspettare più di un massimo di tre secondi. Come posso generare un'eccezione TimeoutException dopo aver atteso tre secondi?

Compito.Corri in soccorso

In .NET, un'attività è qualcosa che vuoi fare. È possibile passare una funzione al metodo Run di Task, che eseguirà quella funzione in modo asincrono in un thread separato e restituirà un oggetto Task.

E allora? Bene, poiché un oggetto Task viene immediatamente restituito dal metodo Task.Run, possiamo chiamare il metodo Wait di Task e attendere tre secondi per il completamento dell'attività. Se è stato completato correttamente, questo metodo restituisce true. Se non è stato completato, restituisce false. Quindi possiamo testare l'output e restituire un output a seconda di ciò che vogliamo fare.

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

Questo modello può essere utilizzato per migliorare le prestazioni del mio codice:garantisce che se la mia applicazione si blocca per qualsiasi motivo, so di poter controllare la durata massima del blocco.