Sobes.tech
Middle

როგორ შეიძლება გაუქმდეს C#-ში დავალების (task) შესრულება?

sobes.tech AI

პასუხი AI-სგან

C# тилинде тапшырманы жокко чыгаруу үчүн CancellationToken жана CancellationTokenSource механизмдери колдонулат.

  1. CancellationTokenSource түзүлөт.
  2. CancellationTokenSource аркылуу CancellationToken алынат.
  3. CancellationToken тапшырманы аткарган методго берилет.
  4. Аткарылып жаткан методдун ичинде IsCancellationRequested мүлкү периоддук текшерилет.
  5. Эгер IsCancellationRequested true болсо, OperationCanceledException жаратылат же башка аяктоо логикасы ишке ашырылат.
  6. Жокко чыгаруу өтүнүчү үчүн 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 колдоосу менен жакшы интеграцияланган.