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-ի աջակցությամբ: