Middle
Kako otkazati izvršenje zadatka (task) u C#?
sobes.tech АИ
Одговор од АИ
Za otkaz od izvršenja zadatka u C# koristi se mehanizam CancellationToken i CancellationTokenSource.
- Kreira se
CancellationTokenSource. - Iz
CancellationTokenSourcese dobijaCancellationToken. CancellationTokense prosleđuje metodi koja izvršava zadatak.- Unutar izvršavane metode periodično se proverava svojstvo
IsCancellationRequestedtokena. - Ako je
IsCancellationRequestedjednakotrue, generiše seOperationCanceledExceptionili se vrši druga logika za završetak. - Za zahtev za otkazivanje se poziva metoda
Cancel()na objektuCancellationTokenSource.
Primer upotrebe:
using System;
using System.Threading;
using System.Threading.Tasks;
// Kreiranje izvora tokena za otkazivanje
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
// Kreiranje zadatka
Task task = Task.Run(() =>
{
try
{
for (int i = 0; i < 100; i++)
{
// Provera da li je zatraženo otkazivanje
if (token.IsCancellationRequested)
{
// Generisanje izuzetka OperationCanceledException
token.ThrowIfCancellationRequested();
}
// Simulacija rada
Console.WriteLine($"Radim... {i}");
Thread.Sleep(100);
}
}
catch (OperationCanceledException)
{
// Obrada izuzetka otkazivanja
Console.WriteLine("Zadatak je otkazan.");
}
catch (Exception ex)
{
// Obrada drugih izuzetaka
Console.WriteLine($"Došlo je do greške: {ex.Message}");
}
}, token); // Prosleđivanje tokena u zadatak
// Čekanje određeno vreme, zatim zahtev za otkazivanje
Thread.Sleep(500);
Console.WriteLine("Zahtevam otkazivanje...");
cts.Cancel();
// Čekanje završetka zadatka
try
{
task.Wait();
}
catch (AggregateException ae)
{
// Obrada izuzetaka, uključujući OperationCanceledException
foreach (var e in ae.InnerExceptions)
{
if (e is OperationCanceledException)
{
Console.WriteLine("Završena otkazana zadatak (kroz Wait).");
}
else
{
// Obrada drugih izuzetaka
Console.WriteLine($"Greška pri završetku zadatka: {e.Message}");
}
}
}
Console.WriteLine("Glavni program je završio.");
Alternativne opcije:
- Vraćanje posebne vrednosti ili zastavice iz zadatka.
- Provera zastavice postavljene spolja, bez korišćenja
CancellationToken.
Međutim, CancellationToken je standardni i preporučeni pristup zbog svoje integracije sa Task Parallel Library (TPL), asinhronim operacijama i podrškom za OperationCanceledException.