Sobes.tech
Middle

Чӣ тавр метавон иҷрои вазифа (task) дар C#-ро бекор кард?

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.