Sobes.tech
Middle

C# da iplar (Thread) va vazifalar (Task) o'rtasidagi farq nima?

sobes.tech AI

AIdan javob

IP tarmoq (Thread) — bu operatsion tizimining pastki darajadagi abstraktsiyasini ifodalaydi va kodni parallel ravishda bajarish uchun mo'ljallangan. Vazifalar (Task) — .NETda yuqori darajadagi tushuncha bo'lib, u thread havuziga asoslangan bo'lib, asinxron va parallel dasturlashni soddalashtiradi.

Asosiy farqlar:

  • Abstraktsiya darajasi: Thread to'g'ridan-to'g'ri operatsion tizimning tarmog'lari bilan ishlaydi. Task — bu planlashtiruvchi (odatda ThreadPool) tomonidan boshqariladigan abstraktsiya.
  • Boshqaruv: Threadlarni qo'lda boshqarish (yaratish, ishga tushirish, to'xtatish) murakkab bo'lishi mumkin. Task planlashtiruvchi tomonidan boshqariladi, bu esa ularni foydalanishni osonlashtiradi.
  • Resurslar: Yangi Thread yaratish, Thread havuzidan foydalanishga qaraganda, ko'proq tizim resurslarini talab qiladi.
  • Qaytish qiymatlari va istisnolar: Task qaytariladigan qiymatlarni (Task<TResult>) olish va ishlov berilmagan istisnolarni boshqarish uchun ichki mexanizmlarga ega. Thread uchun bu qo'lda amalga oshiriladi.
  • Asinxronlik: Task async va await so'zlari bilan yaqin integratsiyalashgan, bu esa asinxron kod yozishni sezilarli darajada soddalashtiradi. Thread uchun asinxronlik qo'lda callbacklar yoki boshqa mexanizmlar yordamida amalga oshiriladi.
  • Bekor qilish: Taskni bekor qilish CancellationToken orqali qo'llab-quvvatlanadi. Threadni bekor qilish uchun bekor qilish mexanizmlarini qo'lda amalga oshirish kerak.

Yaratish va kutish misoli:

// Taskdan foydalanish
async Task MyTaskAsync()
{
    await Task.Delay(100);
    Console.WriteLine("Vazifa tugadi");
}

// Taskni ishga tushurish va kutish
Task t = MyTaskAsync();
await t;

// Threaddan foydalanish (pastki darajadagi yondashuv)
Thread myThread = new Thread(() =>
{
    Thread.Sleep(100);
    Console.WriteLine("Thread tugadi");
});

// Threadni ishga tushurish
myThread.Start();

// Thread tugashini kutish (bloklovchi chaqiriq)
myThread.Join();