Zamonaviy ilovalarda foydalanuvchi tajribasi har qachongidan ham muhimroq. Foydalanuvchilar ilovalar tezkor va sezgir bo'lishini kutishadi. Agar biror operatsiya uzoq davom etsa, uni bekor qilish imkoniyati bo'lishi kerak. Aynan shu yerda .NET freymvorkidagi CancellationToken mexanizmi yordamga keladi.
Tasavvur qiling, siz onlayn kitob doʻkoni ilovasini ishlab chiqyapsiz. Foydalanuvchi kitob nomini kiritadi va ilova bir nechta yirik maʼlumotlar bazalaridan (Amazon, Google Books, mahalliy kutubxona) maʼlumot qidiradi.
Foydalanuvchi "Harry Potter" deb qidiruvni boshladi. Ilova uchta manbaga so‘rov yuboradi. Birinchi ikkitasidan javob tez keladi, lekin uchinchisi (masalan, uzoqdagi arxiv kutubxonasi) juda sekin ishlaydi. Foydalanuvchi kutmay, yangi "Dune" kitobini qidiradi.
Agar CancellationToken ishlatilmasa:
- Ilova hanuz "Harry Potter" so‘rovini bajaradi
- Resurslar (CPU, tarmoq) bekor ketadi
- UX yomonlashadi
CancellationToken bu muammoni hal qilish uchun quyidagi tarzda ishlaydi:
CancellationTokenSourceobyektini yaratishCancellationTokenni asinxron funksiyalarga uzatish- Operatsiya davomida
token.IsCancellationRequestedorqali to‘xtatish holatini tekshirish Cancel()metodi orqali barcha faol vazifalarni bekor qilish
- ✅ Resurslarni tejaydi: Bekor qilingan ishlar CPU/xotirani band qilmaydi.
- ⚡ Tezroq javob beradi: Ilova yangi so‘rovlarga tezlik bilan reaksiya beradi.
- 🧑💻 Foydalanuvchi tajribasi oshadi: Bekor qilish imkoniyati UXni oshiradi.
- 🧱 Barqarorlikni saqlaydi: Uzoq operatsiyalar tizimni ishdan chiqarmaydi.
using System;
using System.Threading;
using System.Threading.Tasks;
public class Program
{
public static async Task Main(string[] args)
{
Console.WriteLine("Vazifani boshlash...");
using var cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
try
{
Task task = DoWorkAsync(5000, token);
await Task.Delay(1000);
cts.Cancel();
Console.WriteLine("Vazifa bekor qilish signali yuborildi.");
await task;
}
catch (OperationCanceledException)
{
Console.WriteLine("Vazifa muvaffaqiyatli bekor qilindi!");
}
catch (Exception ex)
{
Console.WriteLine($"Xatolik: {ex.Message}");
}
Console.WriteLine("Dastur tugadi.");
}
public static async Task DoWorkAsync(int delayMs, CancellationToken cancellationToken)
{
try
{
Console.WriteLine($"Ish boshlandi, {delayMs / 1000} soniya kutilyapti...");
await Task.Delay(delayMs, cancellationToken);
Console.WriteLine("Ish muvaffaqiyatli yakunlandi.");
}
catch (OperationCanceledException)
{
Console.WriteLine("Bekor qilish so'rovi qabul qilindi.");
throw;
}
}
}