Middle
Kuidas tühistada ülesande (task) täitmine C#-s?
sobes.tech AI
Vastus AI-lt
Ülesande tühistamiseks C#-s kasutatakse CancellationToken ja CancellationTokenSource mehhanismi.
- Loome
CancellationTokenSource. CancellationTokenSource-st saadakseCancellationToken.CancellationTokenantakse edasi meetodile, mis täidab ülesande.- Täidetava meetodi sees kontrollitakse perioodiliselt omadust
IsCancellationRequested. - Kui
IsCancellationRequestedontrue, visatakseOperationCanceledExceptionvõi täidetakse muu lõpetamise loogika. - Tühistamisnõude esitamiseks kutsutakse välja
Cancel()meetodCancellationTokenSourceobjektil.
Näide kasutamisest:
using System;
using System.Threading;
using System.Threading.Tasks;
// Tühistamiste tokenite allika loomine
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
// Ülesande loomine
Task task = Task.Run(() =>
{
try
{
for (int i = 0; i < 100; i++)
{
// Kontroll, kas on palutud tühistamine
if (token.IsCancellationRequested)
{
// Visata `OperationCanceledException`
token.ThrowIfCancellationRequested();
}
// Imitatsioonitöö
Console.WriteLine($"Töötan... {i}");
Thread.Sleep(100);
}
}
catch (OperationCanceledException)
{
// Tühistamise erandi töötlemine
Console.WriteLine("Ülesanne tühistati.");
}
catch (Exception ex)
{
// Muude erandite töötlemine
Console.WriteLine($"Viga: {ex.Message}");
}
}, token); // Tokeni edastamine ülesandele
// Ootame teatud aega, siis palume tühistamist
Thread.Sleep(500);
Console.WriteLine("Tühistamisnõue...");
cts.Cancel();
// Ootame ülesande lõpetamist
try
{
task.Wait();
}
catch (AggregateException ae)
{
// Erandite töötlemine, sh `OperationCanceledException`
foreach (var e in ae.InnerExceptions)
{
if (e is OperationCanceledException)
{
Console.WriteLine("Tühistatud ülesanne lõpetati (Wait kaudu)." );
}
else
{
// Muude erandite töötlemine
Console.WriteLine($"Viga ülesande lõpetamisel: {e.Message}");
}
}
}
Console.WriteLine("Peamine programm lõpetas.");
Alternatiivid:
- Spetsiifilise väärtuse või lipu tagastamine ülesandest.
- Väljast seatud lipu kontrollimine ilma
CancellationToken-ita.
Kuid, CancellationToken on standardne ja soovitatav lähenemine tänu selle integratsioonile Task Parallel Library (TPL), asünkroonsete operatsioonide ja toetusega OperationCanceledException.