Как да работя с нишки в C #

Нишката е най-малката единица за изпълнение в процеса. Многопоточността е възможността да имате множество нишки в паметта в даден момент и да превключвате между тях, за да обработвате множество операции едновременно. .Net Framework на Microsoft предоставя отлична поддръжка за работа с нишки.

Програмиране на нишки в C #

За да работите с нишки, трябва да включите в приложението си пространството от имена System.Threading. За да създадете нова нишка, трябва да използвате делегата ThreadStart и да предадете препратката към метод, който трябва да се изпълни в нишката. Обърнете внимание, че делегатът е указател за безопасност на типа. Следният кодов фрагмент показва как можете да създадете нов обект на нишка с помощта на този делегат.

 Тема t = нова нишка (нов ThreadStart (MyThreadMethod)); 

За да стартирате новосъздадената нишка, трябва да извикате метода Start на обекта на нишката, който сте създали. Следният списък с кодове илюстрира това. Обърнете внимание, че методът на нишката MyThreadMethod се изпълнява върху новата нишка (наречена работна нишка), която е създадена.

 статична празнота Главна ()

        {

            Тема t = нова нишка (нов ThreadStart (MyThreadMethod));

            t.Start ();           

            Console.Read ();

        }

        static void MyThreadMethod ()

        {

            Console.WriteLine („Здравей, свят!“);

        }

Показване на състоянията на нишките в C #

Конците в паметта могат да бъдат в различни състояния - Прекъснат, Фон, Изпълняващ се, Спиран, Спиран, Несъздаден и др. Състоянията на нишките са дефинирани в изброяването на ThreadState, налично в пространството от имена System.Threading. Освен ако методът Start не е извикан за нишка, нишката е в състояние Unstarted. Когато методът Start се извика в екземпляра на нишката, състоянието на нишката се променя от Unstarted на Running.

Следният кодов фрагмент показва как можете да покажете състоянието на нишка в конзолата.

 Тема t = нова нишка (нов ThreadStart (MyThreadMethod));

t.Start ();

Console.WriteLine („Състоянието на нишката е:“ + t.ThreadState.ToString ());

Контролирайте нива на преден план и фон в C #

Нишките могат да се изпълняват или на преден план, или на заден план. Нишките, които създавате изрично, са нишки на преден план. Една от основните разлики между нишка на преден план и нишка на заден план е, че приложението ви живее само докато се изпълняват една или повече нишки на преден план. По същество нишките на преден план предотвратяват прекратяването на приложението. За разлика от това, фоновите нишки не поддържат средата на Common Language Runtime жива.

Можете да зададете състоянието на фона на нишка, като използвате свойството IsBackground. Ето пример за код, който показва как това може да се постигне.

 статична празнота Главна ()

        {

            Тема t = нова нишка (нов ThreadStart (MyThreadMethod));

            t.Start ();

            t.IsBackground = вярно;

            Console.WriteLine („Състоянието на фона на нишката е:“ + t.IsBackground.ToString ());

            Console.Read ();

        }

Можете да спрете или възобновите нишка, като извикате методите Suspend () и Resume () в обекта на нишката. Имайте предвид, че можете да възобновите нишка, която преди това сте спрели, като извикате метода Suspend ().

 Тема t = нова нишка (нов ThreadStart (MyThreadMethod));

t.Start ();

t.Suspend (); // Спира новосъздадената нишка

т. Резюме (); // Възобновява окачената нишка

Трябва обаче да се отбележи, че методите Thread.Suspend () и Thread.Resume () са остарели. По-скоро трябва да използвате методите AutoResetEvent и EventWaitHandle за синхронизиране на дейности, включващи нишки.

Задайте приоритет на нишката в C #

Можете да контролирате приоритета на нишка, за да определите относителния дял от времето на процесора, който нишката ще получи в сравнение с останалите нишки, намиращи се в паметта. Приоритетът на нишката е дефиниран в изброяването на ThreadPriority. Възможните стойности включват: Най-ниска, Под нормална, нормална, над нормална и най-висока. Следният кодов фрагмент илюстрира как можете да зададете приоритетите на нишките на две нишки, като използвате свойството Priority на обекта на нишката.

 статична празнота Главна ()

        {

            Thread thread1 = new Thread (new ThreadStart (Method1));

            Thread thread2 = new Thread (new ThreadStart (Method2));

            thread1.Priority = ThreadPriority.Highest;

            thread2.Priority = ThreadPriority.Lowest;

            thread2.Start ();

            thread1.Start ();

            Console.Read ();

        }

        static void Method1 ()

        {

            за (int i = 0; i <10; i ++)

            {

                Console.WriteLine („Първа нишка:„ + i);

            }

        }

        static void Method2 ()

        {

            за (int i = 0; i <10; i ++)

            {

                Console.WriteLine („Втора нишка:„ + i);

            }

        }

Когато изпълните горния кодов фрагмент, ще видите, че първата нишка завършва изпълнението си преди втората нишка, въпреки че втората нишка е стартирана преди първата нишка в метода Main.

Конците са скъпи. Те консумират много ресурси във вашата система за инициализация, превключване на контексти и освобождаване на ресурсите, които консумират. Следователно многопоточността трябва да се използва разумно и само когато е необходимо. Когато се възползвате от многопоточност, винаги е препоръчително да използвате пулове от нишки, за да създавате и управлявате нишки при поискване и да подобрите отзивчивостта на вашето приложение.