Урсгалын багц

Сайтад програмчлалын C# хэлний нарийн ухагдхуун, механизмуудын талаарх хичээлүүдийг нийтэлж байгаа. Энэ удаад C# дээр олон урсгалыг хэрэгжүүлэх сэдвийн хүрээнд урсгалын багц гэж юу болох түүнийг хэрхэн ашиглах тухай үзье.

namespace MultiThreadConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            for (int i=1; i<=10; i++)
            {
                Thread thread = new Thread(Work);
                thread.Start(i);
                Thread.Sleep(200);
            }

            Console.ReadLine();
        }

        private static void Work(object i)
        {
            Console.WriteLine("Урсгалын id: {0}, параметр: {1}",
                Thread.CurrentThread.ManagedThreadId, i);
        }
    }
}

код бүхий жижигхэн консол програмыг харцгаая. Кодод 10 алхамтай циклийг эхлээд циклийн дотор шинэ урсгал үүсгээд түүнийг эхлүүлнэ. Дараа нь үндсэн урсгалд 200 милисекунд хүлээлтийг үүсгэнэ. Thread.Sleep(200); команд шинээр үүсгэн эхлүүлсэн thread урсгалд биш харин програмын үндсэн урсгалд хамааралтай гэдгийг сануулъя. Шинээр үүсгэх урсгал бүрд дамжуулж буй Work арга урсгалын id ба параметрийг консолд үзүүлнэ. Урсгалын id гэдэг нь програмыг ажлуулан буй орчноос урсгал бүрд олгох дугаар юм. Тухайн үед эхэлсэн урсгалын дугаарыг Thread.CurrentThread.ManagedThreadId шинжээр авч болно. Програмыг ажлуулбал

дээрх үр дүнг үзүүлнэ. Програмд 10 өөр урсгалыг үүсгээд урсгал бүрд циклийн алхамын дугаарыг дамжуулсан нь үр дүнгээс харагдана. Энд бид маш чухал нэг зүйлийг тооцоогүй. Учир нь урсгал үүсгэх, түүний устгалт, урсгал хоорондын шилжилт зэрэг нь компьютераас нилээд нөөц шаардсан ажиллагаа байдаг. Үүнийг тооцоогүй манай програм үйлдлийн системээс нилээд хэмжээний нөөцийг үр дүнгүй зарцуулах юм. Програмын ажиллагааны логикоос харвал циклд үүсгэж байгаа урсгал бүр эхний урсгалаа дууссаны дараа үүсгэгдэж байхаар бодолцон Thread.Sleep(200); командыг тавин өгсөн учраас ийм тохиолдолд хамаагүй бага нөөцийг зарцуулах боломж байгаа. Кодыг хэрхэн сайжруулах болох вэ? Энд бид урсгалын багцыг ашиглаж

    class Program
    {
        static void Main(string[] args)
        {
            for (int i=1; i<=10; i++)
            {
                ThreadPool.QueueUserWorkItem(Work, i);

                Thread.Sleep(200);
            }

            Console.ReadLine();
        }

        private static void Work(object i)
        {
            Console.WriteLine("Урсгалын id: {0}, параметр: {1}",
                Thread.CurrentThread.ManagedThreadId, i);
        }
    }

гэж хийе. Урсгалын багцын удирдлага ThreadPool статик классаар хийгддэг. Класст шинээр үүсгэгдсэн урсгалд биелэгдэх делегатыг хэрэгтэй бол параметрийн хамтаар дамжуулан өгдөг QueueUserWorkItem гэдэг арга бий. Урсгалын багц болон урсгалыг шууд үүсгэх хоёрын ялгаа гэвэл урсгалын багцаар удирдаж байхад шинэ урсгалыг биелүүлэх ажиллагааг шууд эхлүүлэхгүйгээр урсгалд ажиллах делегатыг дараалалд оруулан өгдөг. Энэхүү дараалал урсгалын багцад /ThreadPool/ байрлах бөгөөд делегат тухайн үед чөлөөтэй байгаа урсгалд биелэгдэх юм. Дараалалд буй делегатын ажиллах ээлж болоход чөлөөтэй урсгал байхгүй бол урсгалын багц шинэ урсгалыг үүсгэн өгдөг. Програмыг ажлуулаад кодын өөрчлөлт ямар дүн өгөхийг харвал

консолд дээрх үр дүн гарна. Өмнөх кодтой ижил ажиллагаа хийж буй өөрчлөлт хийсэн кодын ажиллагаанд 9, 10 гэсэн id -тай урсгалууд оролцож байгааг анхаарна уу. Өмнөх жишээнд 10 урсгал байсан бол одоо 2 урсгал болсноор бид үйлдлийн системийн нөөцийг 5 дахин хэмнэж чадлаа. Урсгалын багцад хэдэн урсгал байгаа, тэднийг ямар төлөвт оршин буйг та хэзээ ч урьдчилан мэдэж чадахгүй. Яг ийм шалтгаанаас үүдэн урсгалыг шууд үүсгэхээс урсгалын багцыг ашиглах нь хамаагүй үр дүнтэй ашигтай байдаг. Энэ давуу тал та олон урсгалыг эрчимтэй ашиглах программыг зохиох үед илүү мэдрэгдэнэ.

Мэдээлэл таалагдсан бол найзуудтайгаа хуваалцаарай.

  Нээгдсэн тоо: 389 Бүртгүүлэх

Нийтлэлээр графикийн хэвүүдийн /GUI pattern/ түүхийг авч үзье. Боловсруулалтын графикийн хэвүүдийг 30 гаруй жилийн туршид боловсруулж байгаа бөгөөд энэ хугацаанд гарч ирсэн бүх хэвүүдийн талаар авч үзэх нь боломжгүй зүйл. Иймээс сүүлийн 30 жилд бий болсон үндсэн хоёр чиг хандлагын талаар авч үзээд энэхүү хоёр хандлага эцэстээ Silverlight ийн MVVM ба WPF паттерн болон хувирсанг харцгаая. Хэрвээ та графикийн хэвүүдийн түүхийн талаарх мэдээллийг сонирхож байвал Мартин Фаулерын - GUI Architectures нийтлэлийг уншаарай.

  Нээгдсэн тоо: 2270 Төлбөртэй

Өгөгдлйн сангаас ID нь 1 тэй тэнцүү харилцагчийн нэрийг өөрчлөх код

    class Program
    {
        static void Main(string[] args)
        {
            var context = new TestDbContext();

            var customer = context.Customers.Single(c => c.CustomerId == 1);
            customer.CustomerName = "А.Ягаан";

            context.SaveChanges();

            Console.ReadLine();
        }
    }

гэж бичигдэнэ. Програмыг ажлуулаад өгөгдлийн сангийн t_customer хүснэгтийг нээн харвал өгөгдөлд өөрчлөлт орсон байгаа. Энд бас нэгэн анхаарах зүйл бий.

  Нээгдсэн тоо: 339 Төлбөртэй

Аргууд хичээлд тодорхойлсон SayHello арга

void SayHello()
{
    Console.WriteLine("Hello");
}
 
SayHello(); // Hello

консолд мэдээллийг үзүүлдэг. Арга консолд нэг ижил мэдээлэл үзүүлж байгаа нь түүний сул тал. Аргаас консолд үзүүлэх мэдээллийг түүнд гаднаас дамжуулан динамикаар тодорхойлбол илүү байхаар. C# -д үүнийг параметрүүд ашиглан шийддэг.

Жич: C# хэл ОХП-ийн аргачллалыг бүрэн дэмждэг тул кодийг голдуу классууд дээр суурилан бичдэг. Класс дотор зарлагдсан функцуудийг арга /method/ гэж нэрлэдэг тул ердийн функцийг ч арга гэж нэрлээд байгаа шүү.

  Нээгдсэн тоо: 492 Бүртгүүлэх

C# хэл дээрх програмийн оролтын цэг Main арга байдаг. Яг энэ аргаас C# дээрх програм биелэгдэж эхэлдэг тул програм заавал Main аргатай байх ёстой. Гэтэл Visual Studio 2022  

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

кодтой консол програмийг үүсгэдэг.

Үйл явдал /event/ тодорхой үйлдэл хийгдсэн талаар системд мэдэгддэг. Хэрвээ бид энэхүү үйлдлийг ажиглах хэрэгтэй бол яг энд…

Нээгдсэн тоо : 220

 

Манай төсөл олон хуудсуудтай болон тэдгээрийн хооронд динамикаар шилжилт хийж байгаа ч тухайн үед шилжилт хийгдсэн хуудаст тохирох…

Нээгдсэн тоо : 303

 

Зочин (Visitor) паттерн классуудыг өөрчлөхгүйгээр тэдгээрийн обьектуудын үйлдлийг тодорхойлох боломжийг олгоно. Зочин хэвийг ашиглахдаа классуудын хоёр ангилалыг тодорхойлно.…

Нээгдсэн тоо : 261

 

Лямбда-илэрхийлэл нь нэргүй аргын хураангуй бичилтийг илэрхийлнэ. Лямбда-илэрхийлэл утга буцаадаг, буцаасан утгыг өөр аргын…

Нээгдсэн тоо : 365

 

Кодийн сайжруулалт /рефакторинг/ хичээлээр програмийн кодоо react -ийн зарчимд нийцүүлэн компонентод салгасан.…

Нээгдсэн тоо : 412

 

Хадгалагч (Memento) хэв обьектын дотоод төлвийг түүний гадна гаргаж дараа нь хайрцаглалтын зарчмыг зөрчихгүйгээр обьектыг сэргээх боломжийг олгодог.

Нээгдсэн тоо : 435

 

Делегаттай нэргүй арга нягт холбоотой. Нэргүй аргуудыг делегатийн хувийг үүсгэхэд ашигладаг.
Нэргүй аргуудын тодорхойлолт delegate түлхүүр үгээр…

Нээгдсэн тоо : 499

 

Математикт харилцан урвуу тоонууд гэж бий. Ямар нэгэн тооны урвуу тоог олохдоо тухайн тоог сөрөг нэг зэрэг дэвшүүлээд…

Нээгдсэн тоо : 576

 

Төсөлд react-router-dom санг оруулан чиглүүлэгчдийг бүртгүүлэн тохируулсан Санг суулган тохируулах хичээлээр бид хуудас…

Нээгдсэн тоо : 599

 
Энэ долоо хоногт

Өдрийн хуваарьт 5 хичээл ордог. Тэгвэл 11 хичээлээс зохиож болох хуваарийн хувилбарын тоог ол. Нэг хичээл өдөрт нэг удаа л орно.

Нээгдсэн тоо : 1946

 

y=8x3 ба y=8x функцуудын графикаар хязгаарлагдсан дүрсийн талбайг ол.

Нээгдсэн тоо : 1063

 

тэгшитгэлийн язгуурууд x1 , x2 , x3 бол

Нээгдсэн тоо : 692