Разбиране на пулове от нишки в C #

Нишката е най-малката единица за изпълнение в процеса. Пул от нишки се състои от множество нишки или, за да бъдем точни, колекция от нишки и може да се използва за извършване на няколко дейности във фонов режим.

Защо трябва да използвам пулове от нишки?

Нишките са скъпи, тъй като консумират много ресурси във вашата система за инициализация, превключване на контексти и освобождаване на ресурсите, които заемат. Обикновено, когато потокът изпълнява I / O операция (обработка на файлове, работа с база данни или достъп до мрежовите ресурси и т.н.), нишката се блокира от операционната система, докато I / O операцията не завърши. Нишката ще възобнови работата на процесора си, след като приключи операцията си на I / O.

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

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

ThreadPool.SetMinThreads (50, 50);

Имайте предвид обаче, че когато се изпълнява дългосрочна задача, нишката на пула от нишки може да бъде блокирана за дълго време. За да се влошат нещата, входящите заявки, които зависят от нишките от пула от нишки, могат да бъдат задържани или дори да бъдат отхвърлени предимно, защото пулът от нишки може да няма налични нишки с него за обработка на входяща заявка. Пул от нишки също не е добър избор, когато имате нишки, които се различават по своите приоритети или може да се наложи да прекратите нишка преждевременно. Преждевременното прекратяване на нишка предполага, че нишката е била спряна принудително преди да изтече времето за обръщане.

Как работи пулът от нишки?

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

И така, приложението ще направи заявка към пула от нишки, за да получи нишка от него, да извърши дейности, използвайки нишката и след това да върне нишката обратно в пула от нишки, когато е готово. Пуловете от нишки са полезни в ситуации, когато имате повече задачи за изпълнение, отколкото можете да създадете нишки (има ограничение за максималния брой нишки, които можете да създадете за процес) във вашето приложение.

Как мога да оптимизирам пула от нишки?

Когато процесът стартира, на него се определя пул от нишки от CLR. Имайте предвид, че можете да конфигурирате размера на пула от нишки, ако е необходимо. Времетраенето управлява интелигентно пула от нишки. Когато пулът от нишки стартира, в пула от нишки има само една нишка. От този момент нататък мениджърът на пула от нишки (компонент, отговорен за управлението на пула от нишки) създава повече нишки и ги съхранява в пула от нишки с увеличаване на натоварването на приложението, т.е. приложението се нуждае от все повече и повече задачи, които да се изпълняват едновременно.

Броят на нишките, които могат да бъдат достъпни в пула от нишки във всеки даден момент от времето, се регулира от максимално допустимата граница на нишките в пула от нишки. С други думи, броят на наличните нишки в пула от нишки варира от време на време в зависимост от консумацията на нишки от приложението. Щом е достигнат максималният лимит (максимален брой нишки в пула от нишки), приложението създава нови нишки много по-рядко.

Винаги можете сами да зададете горната граница на допустимите нишки в пула от нишки, ако е необходимо. За да направите това, трябва да се възползвате от свойството ThreadPool.SetMaxThreads. За да зададете долната граница на нишките в пула от нишки, можете да използвате свойството ThreadPool.SetMinThreads. Долната граница по подразбиране на броя нишки в пула от нишки е една нишка на процесор.