Middle
Kā atcelt uzdevuma (task) izpildi C#?
sobes.tech AI
Atbilde no AI
Uzdevuma atcelšanai C# tiek izmantots CancellationToken un CancellationTokenSource mehānisms.
- Tiek izveidots
CancellationTokenSource. - No
CancellationTokenSourcetiek iegūtsCancellationToken. CancellationTokentiek nodots metodam, kas veic uzdevumu.- Iekš metodes periodiski pārbauda īpašumu
IsCancellationRequested. - Ja
IsCancellationRequestedirtrue, tiek ģenerētaOperationCanceledExceptionvai veikta cita pārtraukšanas loģika. - Lai pieprasītu atcelšanu, tiek izsaukta
Cancel()metode noCancellationTokenSourceobjekta.
Piemērs:
using System;
using System.Threading;
using System.Threading.Tasks;
// Atcelšanas tokenu avota izveide
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
// Uzdevuma izveide
Task task = Task.Run(() =>
{
try
{
for (int i = 0; i < 100; i++)
{
// Pārbaude, vai ir pieprasīta atcelšana
if (token.IsCancellationRequested)
{
// Ģenerēt `OperationCanceledException`
token.ThrowIfCancellationRequested();
}
// Imitējošs darbs
Console.WriteLine($"Strādāju... {i}");
Thread.Sleep(100);
}
}
catch (OperationCanceledException)
{
// Atcelšanas izņēmuma apstrāde
Console.WriteLine("Uzdevums tika atcelts.");
}
catch (Exception ex)
{
// Citu izņēmumu apstrāde
Console.WriteLine($"Kļūda: {ex.Message}");
}
}, token); // Nododam tokenu uzdevumam
// Gaida noteiktu laiku, pēc tam pieprasa atcelšanu
Thread.Sleep(500);
Console.WriteLine("Pieprasīju atcelšanu...");
cts.Cancel();
// Gaida uzdevuma pabeigšanu
try
{
task.Wait();
}
catch (AggregateException ae)
{
// Apstrādā izņēmumus, ieskaitot `OperationCanceledException`
foreach (var e in ae.InnerExceptions)
{
if (e is OperationCanceledException)
{
Console.WriteLine("Atceltais uzdevums pabeigts (caur Wait).");
}
else
{
// Apstrādā citus izņēmumus
Console.WriteLine($"Kļūda, pabeidzot uzdevumu: {e.Message}");
}
}
}
Console.WriteLine("Galvenā programma ir pabeigta.");
Alternatīvas:
- Īpašas vērtības vai zīmi atgriezt no uzdevuma.
- Pārbaudīt ārēji iestatītu zīmi bez
CancellationToken.
Tomēr, CancellationToken ir standarta un ieteicams pieeja, pateicoties tā integrācijai ar Task Parallel Library (TPL), asīnhroniskajām operācijām un atbalstam OperationCanceledException.