Middle
C# да тапшырманын (task) аткарылуусун кантип жокко чыгарыш керек?
sobes.tech AI
AIден жооп
C# тилинде тапшырманы жокко чыгаруу үчүн CancellationToken жана CancellationTokenSource механизмдери колдонулат.
CancellationTokenSourceтүзүлөт.CancellationTokenSourceаркылууCancellationTokenалынат.CancellationTokenтапшырманы аткарган методго берилет.- Аткарылып жаткан методдун ичинде
IsCancellationRequestedмүлкү периоддук текшерилет. - Эгер
IsCancellationRequestedtrueболсо,OperationCanceledExceptionжаратылат же башка аяктоо логикасы ишке ашырылат. - Жокко чыгаруу өтүнүчү үчүн
Cancel()методуCancellationTokenSourceобъектисинде чакырылат.
Келтирилген колдонуу мисалы:
using System;
using System.Threading;
using System.Threading.Tasks;
// Жокко чыгаруу токендеринин булагын түзүү
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
// Тапшырма түзүү
Task task = Task.Run(() =>
{
try
{
for (int i = 0; i < 100; i++)
{
// Жокко чыгаруу суралып жатканына көзөмөл
if (token.IsCancellationRequested)
{
// `OperationCanceledException` жаратылат
token.ThrowIfCancellationRequested();
}
// Эмуляция иши
Console.WriteLine($"Ишке киришүү... {i}");
Thread.Sleep(100);
}
}
catch (OperationCanceledException)
{
// Жокко чыгаруу ишти иштетүү
Console.WriteLine("Тапшырма жокко чыгарылды.");
}
catch (Exception ex)
{
// Башка ката-чыгымдарды иштетүү
Console.WriteLine($"Ката: {ex.Message}");
}
}, token); // Токенди тапшырмага берүү
// Кыска убакыт күтүп, андан кийин жокко чыгаруу өтүнүчү
Thread.Sleep(500);
Console.WriteLine("Жокко чыгаруу өтүнүчү...");
cts.Cancel();
// Тапшырманын аяктоосун күтүү
try
{
task.Wait();
}
catch (AggregateException ae)
{
// Ката-чыгымдар иштетилет, OperationCanceledException кирет
foreach (var e in ae.InnerExceptions)
{
if (e is OperationCanceledException)
{
Console.WriteLine("Жокко чыгарылган тапшырма аяктады (Wait аркылуу).");
}
else
{
// Башка ката-чыгымдарды иштетүү
Console.WriteLine($"Ката: {e.Message}");
}
}
}
Console.WriteLine("Негизги программа аяктады.");
Альтернатива:
- Өзүнчө маанини же флагды кайтаруу.
- Тыштан коюлган флагды текшерүү,
CancellationTokenколдонбостон.
Бирок, CancellationToken стандарттык жана сунушталат, ал Task Parallel Library (TPL), асинхрондук операциялар жана OperationCanceledException колдоосу менен жакшы интеграцияланган.