Sobes.tech
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.

  1. CancellationTokenSource yaratiladi.
  2. CancellationTokenSource dan CancellationToken olinadi.
  3. CancellationToken bajarilayotgan metodga uzatiladi.
  4. Ishlayotgan metod ichida, vaqti-vaqti bilan IsCancellationRequested xususiyati tekshiriladi.
  5. Agar IsCancellationRequested true bo‘lsa, OperationCanceledException yoki boshqa yakunlash logikasi chiqariladi.
  6. Bekor qilish uchun, CancellationTokenSource obyekti ustidan Cancel() 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, CancellationToken ishlatmasdan.

Ammo, CancellationToken standarti va tavsiya etilgan yondashuv bo‘lib, uning Task Parallel Library (TPL), asinxron operatsiyalar va OperationCanceledException bilan integratsiyasi yaxshi amalga oshirilgan.