Middle
Чӣ тавр метавон иҷрои вазифа (task) дар C#-ро бекор кард?
sobes.tech AI
Ҷавоб аз AI
Барои бекор кардани иҷрои вазифа дар C# механизм CancellationToken ва CancellationTokenSource истифода мешавад.
CancellationTokenSourceэҷод мешавад.- Аз
CancellationTokenSourceCancellationTokenгирифта мешавад. CancellationTokenба методе дода мешавад, ки вазифаро иҷро мекунад.- Дар дохили методи иҷрошаванда, пайваста хосият
IsCancellationRequested-и токен санҷида мешавад. - Агар
IsCancellationRequestedбаtrueбаробар бошад,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.