Middle
Ինչպես կարելի է չեղարկել C#-ում առաջադրանքի (task) կատարմանը?
sobes.tech AI
Պատասխան AI-ից
Կատարելու աշխատանքը չեղյալ հայտարարելու համար C#-ում օգտագործվում է CancellationToken և CancellationTokenSource մեխանիզմը:
- Ստեղծվում է
CancellationTokenSource: CancellationTokenSource-ից ստացվում էCancellationToken:CancellationToken-ը փոխանցվում է մեթոդին, որը կատարում է աշխատանքը:- Աշխատանքի ընթացքում պարբերաբար ստուգվում է
IsCancellationRequestedհատկությունը: - Եթե
IsCancellationRequestedհավասար էtrue, ապա գեներացվում էOperationCanceledExceptionկամ կատարվում է այլ ավարտման լոգիկա: - Բեղմնավորելու համար
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-ի աջակցությամբ: