Олон урсгал ямар хэрэгтэй вэ?

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

Үүнийг загварчлахын тулд прогресс бар, Эхлэх, Зогсоох гэсэн хоёр товч бүхий энгийн форм үүсгэе.

Эхлэх товч ажиллагааг эхлүүлнэ гэдэг нь ойлгомжтой. Харин Зогсоох товч ажиллагааг дуусаагүй байхад зогсоох үүрэгтэй. C# дээр програм хэрхэн үүсгэх, формыг яаж зурахыг та өөрөө сайн мэдэж байгаа гэж бодож байна. Програмын үндсэн класс бол

using System;
using System.Threading;

namespace MultiThread
{
    class Worker
    {
        private bool _cancelled = false;

        public void Cancel()
        {
            _cancelled = true;
        }

        public void Work()
        {
            for (int i = 0; i <= 99; i++)
            {
                if (_cancelled)
                    break;
                Thread.Sleep(50);
                ProcessChanged(i);
            }
            WorkCompleted(_cancelled);
        }

        public event Action<int> ProcessChanged;

        public event Action<bool> WorkCompleted;
    }
}

код бүхий ямар нэгэн удаан хугацаанд биелэгдэх ажиллагааг үзүүлэх Worker юм. Класс хэсэг элементээс бүрдэнэ. Эхнийх нь бол ажиллагааг цуцлагдсан эсэхийг заах private хэлбэрийн _cancelled талбар. Талбарт утга олгох Cancel нээлттэй арга удаан хугацаанд биелэгдэх ажиллагааг програмаас зогсоох командыг өгөхөд _cancelled талбарт true утгыг өгөх юм. Классын үндсэн арга Work урт хугаацаатай хийгдэх ажиллагааг төлөөлнө. Арга ердийн цикл эхлүүлээд цикл дотроо _cancelled талбарыг шалгана. Хэрвээ талбарын утга true буюу ажиллагааг цуцалсан бол циклийн ажиллагааг тэр дор нь break командаар зогсооно. Цааш Thread.Sleep(50) командаар бид хийгдэж байгааг ажиллагааг харуулж байгаа хэрэг. Энд урсгал эсхүл багцтай /thread/ ажилладаг эхний аргатай танилцаж байгаа. Sleep арга тухайн үед ажиллаж байгаа урсгалыг заагдсан тооны миллисекундээр зогсоодог. Кодод бид ажиллагааны логикийг төлөөлүүлэн thread -ыг 50 миллисекунд зогсоосон хэрэг. Бодит програмд үүний оронд ямар нэгэн үйлдлийг хийх нь ойлгомжтой. Програм тодорхой үйлдлийг хийсний дараа үйл явцыг ажиглахаар /сонсох/ бүртгүүлсэн бүртгүүлэгчдэд мэдэгдэхийн тулд зохих ажиллагааны үйл явцыг дуудах хэрэгтэй. Циклээс гараагүй учраас ажиллагаа нэг алхамаар урагшилсанг мэдэгдэхийн тулд ProcessChanged үйл явцад циклийн тоолуурыг дамжуулан дуудна. Цикл break командаар эсхүл ердийн явцаараа дууссан эсэхээс үл хамааран WorkCompleted үйл явцад бүртгүүлсэн бүх бүртгүүлэгчдэд ажиллагаа ердийн эсхүл цуцлагдсанг мэдэгдэхийн тулд түүнд _cancelled талбарын утгыг дамжуулан дуудна. Классын төгсгөлд үйл ажиллагааны явцыг ажиглагчдад мэдээллэх ProcessChanged, WorkCompleted хоёр үйл явцыг /event/ зарласан. ProcessChanged үйл явц ажиллагаа ямар нэгэн байдлаар урагшилсанг харин WorkCompleted нь ажиллагаа дууссанг илтгэнэ. Үндсэн классын ажиллагааны логик энгийн учраас таныг ойлгосон гэж үзээд програмын формын кодыг

namespace MultiThread
{
    public partial class MainForm : Form
    {
        private Worker _worker;

        public MainForm()
        {
            InitializeComponent();

            butStart.Click += butStart_Click;
            butStop.Click += butStop_Click;
        }

        private void butStart_Click(object sender, EventArgs e)
        {
            _worker = new Worker();
            _worker.ProcessChanged += _worker_ProcessChanged;
            _worker.WorkCompleted += _worker_WorkCompleted;

            butStart.Enabled = false;

            _worker.Work();
        }

        private void _worker_ProcessChanged(int progress)
        {
            progressBar.Value = progress;
        }

        private void _worker_WorkCompleted(bool cancelled)
        {
            string message = cancelled ? "Ажиллагаа цуцлагдсан" : "Ажиллагаа дууссан";
            MessageBox.Show(message);
            butStart.Enabled = true;
        }

        private void butStop_Click(object sender, EventArgs e)
        {
                  if (_worker != null)
                    worker.Cancel();
        }
    }
}

харцгаая. Эхлээд програмын бүх ажиллагаа нэг багцад /thread/ явагдах синхрон үйл ажиллагааг авч үзье. Формд үндсэн Worker класс төрлийн _worker хувьсагчийг зарласан. MainForm аргад формын Эхлэх, Зогсоох хоёр товчийг дарах үйл явцад бүртгүүлсэн. Үндсэн ажиллагаа butStart_Click аргад явагдана. Аргад Worker классын хувийг /обьект/ үүсгээд түүний ProcessChanged, WorkCompleted үйл явцуудад бүртгүүлнэ. Дараа нь Эхлэх товчийг дарсны дараа хэрэглэгч түүнийг форм дээрээс дахин дахин даруулахгүйн тулд butStart.Enabled = false; гэж идэвхигүй болгоод Worker классын Work аргыг дуудан ажиллагааг эхлүүлнэ. Worker классын үйл явцуудын боловсруулагчид юу хийгдэх вэ? WorkCompleted үйл явц Worker классын ажиллагаа дууссаны дараа үүснэ. Бид ажиллагааг цуцалсан эсэх cancelled хувьсагчийн утга true байвал Ажиллагаа цуцлагдсан харин утга false байвал Ажиллагаа дууссан гэсэн мэдээллийг үзүүлнэ. Үүгээр таны програмын ажиллагааны төлвөөс хамааран ямар ажиллагааг хийхийг харуулах гэсэн юм. Сургалтын жишээнд бид энгийн байлгах үүднээс текстийг дэлгэц дээр харуулаад хэрэглэгч ажиллагааг дахин явуулах боломжийг хангах зорилгоор Эхлэх товчийг идэвхитэй болгосон. ProcessChanged үйл явцын боловсруулагчид прогрес барын утганд түүнд дамжин ирсэн параметрийн утгыг олгосон. Зогсоох товчийг дарахад butStop_Click арга дуудагдах бөгөөд Worker классын хувь /обьект/ _worker үүссэн байвал түүний Cancel аргыг дуудна. Кодыг ажлуулаад Эхлэх товчийг дарвал

ажиллагаа явагдаж байгааг прогресс бар харуулах боловч бид формыг удирдаж чадахгүй. Хэдийгээр Зогсоох товч идэвхитэй байгаа ч түүн дээр даралт хийх боломжгүй. Програм синхрон горимд буюу форм, ажиллагааны процесс хоёр нэг багцад /thread/ ажиллаж байхад үндсэн процесс форм дээрх ямар нэгэн үйлдлийг бүрэн хаадаг. Өөрөөр хэлбэл хэрэглэгчийн форм дээр хийсэн үйлдлийг ердөө хүлээн авахгүй. Яагаад гэвэл Эхлэх товчийг даран ажиллагааг эхлүүлсний дараа бүх нөөцийг тухайн ажиллагаанд өгөөд график интерфейст юу ч үлдээгүйтэй холбоотой. Иймээс Эхлэх товчийг даран эхлүүлж буй ажиллагааг тусдаа урсгалд /thread/ явуулах хэрэгтэй гэсэн дүгнэлтэд хүрнэ.

Дараагийн хичээлүүдэд олон урсгалыг үүсгэн удирдах аргуудын талаар дэлгэрэнгүй авч үзэх болно.

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

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

Виртуал аргууд, шинжүүд хичээлд виртуал аргуудыг тодорхойлох, дахин тодорхойлохыг үзсэн. Суурь классаас өвлөн авсан функцтоналуудыыг өөрчлөх өөр арга бол нуух (shadowing / hiding) юм. Арга, шинжүүдийг нуух нь үнэндээ суурь классийн арга эсхүл шинжүүдтэй нэр, параметрүүдийн багцаар тохирох арга, шинжийг удамшсан класст тодорхойлох юм. Классийн гишүүнийг нуухдаа new түлхүүр үгийг хэрэглэдэг.

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

Entity Framework технологийн тухай ээлжит хичээлийг нийтэллээ. Хичээлээр чиглүүлэгч шинжүүд гэж юу болох тэдгээртэй хэрхэн ажиллахыг авч үзье. Entity Framework манай өгөгдлийн сангийн хэрэглэгчдийн Customer хүснэгтэд

namespace DbDemo
{
    using System;
    using System.Collections.Generic;
    
    public partial class Customer
    {
        public Customer()
        {
            this.Orders = new HashSet<Order>();
        }
    
        public int CustomerId { get; set; }
        public string CustomerName { get; set; }
    
        public virtual ICollection<Order> Orders { get; set; }
    }
}

кодыг үүсгэсэн байгаа.

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

C# нь хатуу төрөлжилттэй хэл тул програмийн кодод ашиглагдаж буй бүх хувьсагчдийн төрлийг заавал тодорхойлосон байх шаардлагатай. Энд төрлүүдийн хувиргалт ухагдхуун маш чухал үүрэгтэй. Төлвүүдийн хөрвүүлэлтийн логикийг ойлгоогүйгээс үүдэн програмийн ажиллагааны явцад алдаа гарах явдал цөөнгүйн дээр ийм төрлийн алдааг илрүүлэхэд нилээд хүндрэл үүсэх талтай. Иймд хэлний онцлогийг зөв ойлгон эзэмшихийг зөвлөе.
Бид Суурь өгөгдлийн төрлүүдийн хөрвүүлэлт хичээлд энгийн төрлүүдийн обьектийн хувиргалтыг үзсэн. Одоо классийн обьектуудын хувиргалтыг авч үзье.

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

Давталт (Iterator) паттерн нийлмэл обьектын бүх элементүүдэд тэдгээрийн дотоод бүтцийг задлахгүйгээр хандах абстракт интерфейсийг тодорхойлдог. C# хэл дээр програм зохиогчид массив эсхүл коллекцийн обьектуудыг татан авдаг foreach циклтэй ажиллаж үзсэн байх. Энэ үед коллекцийн нийлмэл классуудад өөрийн бүтэц ба төлвөөрөө ялгаатай олонлог оршиж байдаг. Коллекцийг foreach -р гүйлгэн обьектуудыг авах боломжийг олгож байгаа түлхүүр хэрэгсэл бол давталт хэв буюу энгийнээр хэлбэл IEnumerable , IEnumerator хоёр интерфейс юм.

Цэсийг нээх хаах ажиллагааг хариуцах компонентийг боловсруулсан тул энэ хичээлээр програмийн удирдах цэсийг…

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

 

Математикийн үйлдлүүдэд нэг ба тэг тоонууд онцгой шинжүүдтэй. Үржих үйлдэлд нэг ба тэг

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

 

Давталт (Iterator) паттерн нийлмэл обьектын бүх элементүүдэд тэдгээрийн дотоод бүтцийг задлахгүйгээр хандах абстракт интерфейсийг тодорхойлдог. C# хэл дээр…

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

 

Тодорхой нөхцөлд жишээ нь тоог тэгд хуваах гэх мэт тохиолдолд систем өөрөө онцгой нөхцлийн генерацийг хийдэг. Гэхдээ C#

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

 

Програмийг удирдах цэсийг нээх болон хаах ажиллагааг хариуцах компонентийг боловсруулъя. Үүний тулд төслийн components хавтаст Navigation хавтасыг үүсгээд…

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

 

Арифметикийн үндсэн 4 үйлдлийн нэг бол үржих. Нэмэх , хасах үйлдлийн талаар…

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

 

Шаблоны арга (Template Method) хэв дэд классуудад алгоритмын бүтцийг өөрчлөхгүйгээр зарим алхамуудыг дахин тодорхойлох боломж олгосон ерөнхий алгоритмыг…

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

 

Гурвалжны медиантай холбоотой бодлогууд шалгалт шүүлэгт ихээр орж ирдэг. Иймээс гурвалжны медиан, түүний шинжүүдийг бүрэн мэддэг байх хэрэгтэй.

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

 

Бүх онцгой нөхцлүүдийн суурь бол Exception төрөл. Төрөлд онцгой нөхцлийн талаарх мэдээллийг авч болох хэдэн шинжийг тодорхойлсон байдаг.…

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

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

илэрхийллийг хялбарчил

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

 

ABCD трапецийн бага диагонал BD=6 бөгөөд суурьтай перпендикуляр. Трапецийн AD=3, DC=12 бол B, D мохоо өнцгийн нийлбэрийг ол.

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

 

Геометрийн шалгалтанд сурагчид шалгалтын асуултуудаас нэг асуулт ирнэ. Сурагч "Дотоод өнцөг" сэдвийн асуултуудад хариулах магадлал 0,35 харин "Багтаасан тойрог" сэдвийн асуултуудад хариулах ммагадлал 0,2 байжээ. Шалгалтын асуултуудад энэ хоёр сэдэвт хоёуланд зэрэг хамаарах асуулт байхгүй бол сурагчид энэ хоёр сэдвийн аль нэгэнд нь хамааралтай асуулт ирэх магадлалыг ол.

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