C# Kortejlar C# kartejlarni e’lon qilish


Download 260.19 Kb.
bet5/28
Sana18.06.2023
Hajmi260.19 Kb.
#1574109
1   2   3   4   5   6   7   8   9   ...   28
Bog'liq
dasturlash tyorya 8 shrift

10C# tilida Oqimlar
Buning uchun Thread klassi konstruktoriga uzatiladigan ParameterizedThreadStart delegati ishlatiladi:public delegate void ParameterizedThreadStart(object? obj);
ParameterizedThreadStart delegatidan foydalanish bilan ishlashga o'xshaydi ThreadStart. Keling, bir misolni ko'rib chiqaylik:
using System.Threading; // создаем новые потоки Thread myThread1 = new Thread(new ParameterizedThreadStart(Print)); Thread myThread2 = new Thread(Print); Thread myThread3 = new Thread(message => Console.WriteLine(message)); // запускаем потоки myThread1.Start("Hello"); myThread2.Start("Привет"); myThread3.Start("Salut");
void Print(object? message) => Console.WriteLine(message);
Yiv yaratilganda, Thread sinfining konstruktoriga ParameterizedThreadStart delegat ob'ekti new Thread(new ParameterizedThreadStart(Print))yoki to'g'ridan-to'g'ri ushbu delegatga ( ) mos keladigan usul new Thread(Print), shu jumladan lambda ifodasi ( new Thread(message => Console.WriteLine(message))) shaklida uzatiladi.
Keyin ip ishga tushirilgach, Start()qiymat usulga o'tkaziladi, u Chop etish usuli parametriga o'tkaziladi. Va bu holda, biz quyidagi konsol chiqishini olamiz: salom salom
ParameterizedThreadStart dan foydalanganda biz cheklovga duch kelamiz: biz faqat turdagi ob'ektni oladigan ikkinchi ish zarrachasida usulni ishga tushirishimiz mumkin object?. Shuning uchun, agar biz boshqa turdagi ma'lumotlardan foydalanmoqchi bo'lsak, biz usulning o'zida turdagi castni bajarishimiz kerak. Masalan:
using System.Threading;
int number = 4;// создаем новый поток
Thread myThread = new Thread(Print);
myThread.Start(number); // n * n = 16
// действия, выполняемые во втором потокке
void Print(object? obj){// здесь мы ожидаем получить числоif (obj is int n){Console.WriteLine($"n * n = {n * n}");}}
bu holda, hisob-kitoblarda foydalanish uchun uzatilgan qiymatni qo'shimcha ravishda int turiga o'tkazishimiz kerak.Ammo biz bir emas, balki har xil turdagi bir nechta parametrlarni o'tkazishimiz kerak bo'lsa-chi? Bunday holda siz o'zingizning turlaringizni belgilashingiz mumkin:
using System.Threading;
Person tom = new Person("Tom", 37);// создаем новый поток Thread myThread = new Thread(Print); myThread.Start(tom); void Print(object? obj){// здесь мы ожидаем получить объект Person if (obj is Person person){Console.WriteLine($"Name = {person.Name}");Console.WriteLine($"Age = {person.Age}");}}
record class Person(string Name, int Age);
Birinchidan, biz maxsus Person sinfini aniqlaymiz, uning ob'ekti ikkinchi ipga o'tkaziladi va Main usulida uni ikkinchi ipga o'tkazamiz.
Ammo bu erda yana bitta cheklov bor: usul tipga Thread.Startxavfsiz emas, ya'ni biz unga istalgan turni o'tkazishimiz mumkin, keyin esa o'tkazilgan ob'ektni o'zimizga kerak bo'lgan turga chiqarishimiz kerak bo'ladi. Ushbu muammoni hal qilish uchun barcha foydalanilgan usullar va o'zgaruvchilarni maxsus sinfda e'lon qilish va asosiy dasturda ThreadStart orqali ipni boshlash tavsiya etiladi. Masalan:
using System.Threading;
Person tom = new Person("Tom", 37);
// создаем новый поток
Thread myThread = new Thread(tom.Print);
myThread.Start(); record class Person(string Name, int Age){public void Print(){Console.WriteLine($"Name = {Name}");Console.WriteLine($"Age = {Age}");}

Download 260.19 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   ...   28




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling