Middle
Come annullare l'esecuzione di un task in C#?
sobes.tech AI
Risposta dell'AI
Per annullare l'esecuzione di un task in C#, si utilizza il meccanismo CancellationToken e CancellationTokenSource.
- Si crea un
CancellationTokenSource. - Si ottiene un
CancellationTokendalCancellationTokenSource. - Il
CancellationTokenviene passato al metodo che esegue il task. - All'interno del metodo in esecuzione, si verifica periodicamente la proprietà
IsCancellationRequesteddel token. - Se
IsCancellationRequestedètrue, si genera unaOperationCanceledExceptiono si esegue altra logica di terminazione. - Per richiedere la cancellazione, si chiama il metodo
Cancel()sull'oggettoCancellationTokenSource.
Esempio di utilizzo:
using System;
using System.Threading;
using System.Threading.Tasks;
// Creare una sorgente di token di cancellazione
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
// Creare un task
Task task = Task.Run(() =>
{
try
{
for (int i = 0; i < 100; i++)
{
// Verificare se è stata richiesta la cancellazione
if (token.IsCancellationRequested)
{
// Generare un'eccezione OperationCanceledException
token.ThrowIfCancellationRequested();
}
// Simulare lavoro
Console.WriteLine($"Lavoro in corso... {i}");
Thread.Sleep(100);
}
}
catch (OperationCanceledException)
{
// Gestire l'eccezione di cancellazione
Console.WriteLine("Task cancellato.");
}
catch (Exception ex)
{
// Gestire altre eccezioni
Console.WriteLine($"Errore: {ex.Message}");
}
}, token); // Passare il token al task
// Attendere un po' e poi richiedere la cancellazione
Thread.Sleep(500);
Console.WriteLine("Richiesta di cancellazione...");
cts.Cancel();
// Attendere che il task finisca
try
{
task.Wait();
}
catch (AggregateException ae)
{
// Gestire le eccezioni, inclusa OperationCanceledException
foreach (var e in ae.InnerExceptions)
{
if (e is OperationCanceledException)
{
Console.WriteLine("Task cancellato (tramite Wait)." );
}
else
{
// Gestire altre eccezioni
Console.WriteLine($"Errore: {e.Message}");
}
}
}
Console.WriteLine("Programma principale terminato.");
Alternative:
- Restituire un valore speciale o un flag dal task.
- Verificare un flag impostato esternamente, senza usare
CancellationToken.
Tuttavia, CancellationToken è l'approccio standard e raccomandato grazie alla sua integrazione con la Task Parallel Library (TPL), operazioni asincrone e supporto per OperationCanceledException.