Middle
C# da vazifa (task) bajarilishini qanday bekor qilish mumkin?
sobes.tech AI
AIdan javob
C# da taskni bekor qilish uchun CancellationToken va CancellationTokenSource mexanizmi ishlatiladi.
CancellationTokenSourceyaratiladi.CancellationTokenSourcedanCancellationTokenolinadi.CancellationTokenbajarilayotgan metodga uzatiladi.- Ishlayotgan metod ichida, vaqti-vaqti bilan
IsCancellationRequestedxususiyati tekshiriladi. - Agar
IsCancellationRequestedtruebo‘lsa,OperationCanceledExceptionyoki boshqa yakunlash logikasi chiqariladi. - Bekor qilish uchun,
CancellationTokenSourceobyekti ustidanCancel()metodi chaqiriladi.
Foydalanish misoli:
using System;
using System.Threading;
using System.Threading.Tasks;
// Bekor qilish token manbaini yaratamiz
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
// Task yaratamiz
Task task = Task.Run(() =>
{
try
{
for (int i = 0; i < 100; i++)
{
// Bekor qilish so‘rovi bor-yo‘qligini tekshirish
if (token.IsCancellationRequested)
{
// OperationCanceledException chiqarish
token.ThrowIfCancellationRequested();
}
// Ishni simulyatsiya qilish
Console.WriteLine($"Ishlayapman... {i}");
Thread.Sleep(100);
}
}
catch (OperationCanceledException)
{
// Bekor qilish istisnosini boshqarish
Console.WriteLine("Vazifa bekor qilindi.");
}
catch (Exception ex)
{
// Boshqa istisnolarni boshqarish
Console.WriteLine($"Xato yuz berdi: {ex.Message}");
}
}, token); // Tokenni vazifaga uzatamiz
// Bir oz kutamiz va so‘ng bekor qilishni so‘raymiz
Thread.Sleep(500);
Console.WriteLine("Bekor qilish so‘rovi yuborilmoqda...");
cts.Cancel();
// Vazifa tugashini kutamiz
try
{
task.Wait();
}
catch (AggregateException ae)
{
// Istisnolarni boshqarish, OperationCanceledException ham
foreach (var e in ae.InnerExceptions)
{
if (e is OperationCanceledException)
{
Console.WriteLine("Bekor qilingan vazifa yakunlandi (Wait orqali)." );
}
else
{
// Boshqa istisnolarni boshqarish
Console.WriteLine($"Xato: {e.Message}");
}
}
}
Console.WriteLine("Asosiy dastur yakunlandi.");
Alternativlar:
- Maxsus qiymat yoki flagni vazifadan qaytarish.
- Tashqaridan o‘rnatilgan flagni tekshirish,
CancellationTokenishlatmasdan.
Ammo, CancellationToken standarti va tavsiya etilgan yondashuv bo‘lib, uning Task Parallel Library (TPL), asinxron operatsiyalar va OperationCanceledException bilan integratsiyasi yaxshi amalga oshirilgan.