Middle
Ako zrušiť vykonávanie úlohy (task) v C#?
sobes.tech AI
Odpoveď od AI
Za zrušenie úlohy v C# sa používa mechanizmus CancellationToken a CancellationTokenSource.
- Vytvorí sa
CancellationTokenSource. - Z
CancellationTokenSourcesa získaCancellationToken. CancellationTokensa odovzdá do metódy, ktorá vykonáva úlohu.- Vo vnútri vykonávanej metódy sa periodicky kontroluje vlastnosť
IsCancellationRequestedtokenu. - Ak je
IsCancellationRequestedrovnétrue, generuje saOperationCanceledExceptionalebo sa vykoná iná logika ukončenia. - Pre požiadavku na zrušenie sa volá metóda
Cancel()na objekteCancellationTokenSource.
Príklad použitia:
using System;
using System.Threading;
using System.Threading.Tasks;
// Vytvorenie zdroja tokenov zrušenia
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
// Vytvorenie úlohy
Task task = Task.Run(() =>
{
try
{
for (int i = 0; i < 100; i++)
{
// Kontrola, či bola požiadavka na zrušenie
if (token.IsCancellationRequested)
{
// Generovanie výnimky OperationCanceledException
token.ThrowIfCancellationRequested();
}
// Simulácia práce
Console.WriteLine($"Pracujem... {i}");
Thread.Sleep(100);
}
}
catch (OperationCanceledException)
{
// Spracovanie výnimky zrušenia
Console.WriteLine("Úloha bola zrušená.");
}
catch (Exception ex)
{
// Spracovanie iných výnimiek
Console.WriteLine($"Došlo k chybe: {ex.Message}");
}
}, token); // Odovzdanie tokenu do úlohy
// Čakanie určitý čas, potom požiadavka na zrušenie
Thread.Sleep(500);
Console.WriteLine("Žiadam o zrušenie...");
cts.Cancel();
// Čakanie na dokončenie úlohy
try
{
task.Wait();
}
catch (AggregateException ae)
{
// Spracovanie výnimiek, vrátane OperationCanceledException
foreach (var e in ae.InnerExceptions)
{
if (e is OperationCanceledException)
{
Console.WriteLine("Dokončená zrušená úloha (cez Wait).");
}
else
{
// Spracovanie iných výnimiek
Console.WriteLine($"Chyba pri ukončení úlohy: {e.Message}");
}
}
}
Console.WriteLine("Hlavný program bol ukončený.");
Alternatívy:
- Vrátenie špeciálnej hodnoty alebo vlajky z úlohy.
- Kontrola vlajky nastavené zvonku bez použitia
CancellationToken.
Avšak, CancellationToken je štandardný a odporúčaný prístup vďaka svojej integrácii s Task Parallel Library (TPL), asynchrónnymi operáciami a podporou OperationCanceledException.