Задаци са више навоја у Ц #

Тхе рачунарско програмирање Израз "нит" је кратак за нит извршења, у којем процесор следи одређени пут кроз ваш код. Концепт праћења више одједном нити уводи предмет више задатака и вишеструких навоја.

Апликација има један или више процеса у њој. Замислите процес као програм који се покреће на вашем рачунару. Сада сваки процес има једну или више нити. Апликација за игре можда има нит за учитавање ресурса са диска, други за АИ, а други за покретање игре као сервера.

У .НЕТ / Виндовс, оперативни систем нит додељује процесорско време. Свака нит прати обрађиваче изузетака и приоритет при којем се изводи, а има негде да сачува контекст нити док се не покрене. Контекст теме је информација коју нит мора да настави.

Више задатака са нитима

Нити заузимају мало меморије и креирање истих траје мало времена, тако да обично не желите да их користите. Запамтите, они се такмиче за време процесора. Ако рачунар има више ЦПУ-а, онда Виндовс или .НЕТ могу покренути сваку нит на другом ЦПУ-у, али ако неколико нити ради на истом ЦПУ-у, тада само један може бити активан истовремено, а пребацивање нити траје време.

instagram viewer

ЦПУ покреће нит за неколико милиона упутстава, а затим прелази на другу нит. Сви регистри ЦПУ-а, тренутна тачка извршења програма и сноп морају се сачувати негде за прву нит, а затим вратити негде другде за следећу нит.

Стварање теме

У систему имена. Нити, наћи ћете тип нити. Навој конструктора (ТхреадСтарт) ствара инстанцу нити. Међутим, у последње време Ц # кода, већа је вероватноћа да ће прећи у ламбда изразу који позива методу са било којим параметрима.

Ако нисте сигурни ламбда изрази, можда би било вредно проверити ЛИНК.

Ево примера нити која се креира и започиње:

коришћење система;
користећи Систем. Тхреадинг;
намеспаце ек1
{
разредни програм
{
јавна статичка празнина Врите1 ()
{
Конзола. Врите ('1');
Конац. Спавање (500);
}
статиц воид Маин (стринг [] аргс)
{
вар задатак = нова тема (Врите1);
задатак. Почетак() ;
за (вар и = 0; и <10; и ++)
{
Конзола. Врите ('0');
Конзола. Пишите (задатак). Је жив? 'А': 'Д');
Конац. Спавање (150);
}
Конзола. РеадКеи ();
}
}
}

Све што овај пример прави је писање "1" на конзоли. Главни конац упише "0" на конзолу 10 пута, сваки пут након чега следи "А" или "Д", зависно од тога да ли је друга нит још увек жива или мртва.

Друга нит покреће се само једном и упише "1." Након пола секунде кашњења у низу Врите1 (), нит се завршава и Задатак. ИсАливе у главној петљи сада враћа „Д.“

Библиотека нити и паралелна библиотека задатака

Уместо да креирате сопствену нит, осим ако стварно не морате да то урадите, користите базену нити. Од .НЕТ 4.0 имамо приступ библиотеци паралелних задатака (ТПЛ). Као и у претходном примеру, опет нам треба мало ЛИНК-а, и да, све су то ламбда изрази.

Задаци користе Навојни базен иза сцене, али боље користите нити у зависности од броја који користите.

Главни предмет у ТПЛ-у је задатак. Ово је класа која представља асинхрону операцију. Најчешћи начин за покретање ствари је помоћу задатка. Фабрика. СтартНев као у:

Задатак. Фабрика. СтартНев (() => ДоСометхинг ());

Где је ДоСометхинг () метода која се изводи. Могуће је створити задатак, а не покренути га одмах. У том случају само користите задатак као што је овај:

вар т = нови задатак (() => конзола. ВритеЛине ("Здраво"));
...
т. Почетак();

То не покреће нит све док се не позове .Старт (). У доњем примеру је пет задатака.

коришћење система;
користећи Систем. Тхреадинг;
користећи Систем. Нити. Задаци;
намеспаце ек1
{
разредни програм
{
јавна статичка празнина Врите1 (инт и)
{
Конзола. Врите (и);
Конац. Спавање (50);
}
статиц воид Маин (стринг [] аргс)
{
за (вар и = 0; и <5; и ++)
{
вар вредност = и;
вар руннингТаск = Задатак. Фабрика. СтартНев (() => Врите1 (вредност));
}
Конзола. РеадКеи ();
}
}
}

Покрените то и добит ћете цифре од 0 до 4, случајним редоследом, као што је 03214. То је зато што редослед извршавања задатка одређује .НЕТ.

Можда се питате зашто је потребна вредност вар = = и. Покушајте да га уклоните и позовите Врите (и), и видећете нешто неочекивано попут 55555. Зашто је ово? То је зато што задатак показује вредност и у тренутку извршења задатка, а не када је задатак креиран. Стварајући нову променљива сваки пут у петљи, свака од пет вредности исправно се складишти и покупи.

instagram story viewer