Главная » Просмотр файлов » Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010)

Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865), страница 94

Файл №1160865 Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (Нэш Трей - C# 2010. Ускоренный курс для профессионалов (2010)) 94 страницаНэш Трей - C# 2010. Ускоренный курс для профессионалов (2010) (1160865) страница 942019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 94)

В противном случае при переходе иа другую реализацию С).К вы непременно столкнетесь с чем-то, что нарушит работу приложения. Также ошибочно заключение, что многопоточное программирование сводится лишь к созданию дополнительных потоков, которые выполилют какую-то работу, требующую ощутимых затрат времени. Конечно это так, ио это лишь часть картины. При соэдаиии настольного приложения вы определенно захотите применить многопоточность, чтобы обеспечить отзывчивость пользовательского интерфейса во время выполнения длительных вычислений, поскольку всем известно, иасколько нетерпеливыми становятся пользователи, когда настольные приложения вдруг начинают реагировать с задержками.

Однако важно понимать, что общая мозаика многопоточности ие сводится просто к созданию дополнительного потока для выполнения некоторого случайного кода. Эта задача в среде Сз действительно довольно проста, ио давайте посмотрим, так ли здесь все просто, как может показаться иа первый взгляд. Запуск потоков Как уже было сказано, создать поток очень просто. Взгляните иа следующий код, чтобы понять, что имеется в виду: свгпч Яузгеш; пз1пд Яузтеш.ТЬгеаб1пСсП рпЬ1гс с1азз ЕптгуРо1пс рггтаее згаг1с тога ТЬгеабгппс() Сопзо1е.иг11е11пе( "Привет из потока (О))" ТЬгеаб.сиггепгТЬгеаб.сегНазЬСобе О ) згаГ1с го(б Ма1п () // Создание нового потока.

ТЬгеаб пенТЬгеаб = пен ТЬгеаб( пен ТЬгеасзсагс(ЕптгуРогпГ.ТЬгеабгппс) Сопзо1е.Хг1теььпе( "Главный поток (О)", ТЬгеаб.спггепГТЬгеаб.иапачебТЬгеаб1б )1 Сопзо1е.Хггте(ьпе( "Запуск нового потока..." // Запуск нового потока. пеиТЬгеаб.ЗСагс О л // Ожидание завершения работы нового потока. пенТЬгеаб.бо1п(); Сопзо1е.ыг1те11пе( "Новый поток завершен" )Л Многопоточность в С№ 359 Все, что потребуется сделать — зто создать объект 5узсет.

Тпгеаб и передать ему экземпляр делегата Тпгеабзсагг в качестве параметра конструктора. Делегат тпгеабэгагг ссылается на метод, ничего не принимающий и не возвращающий. В приведенном примере в качестве стартовой точки выполнения нового потока используется статический метод Тпгеабуцпс.

Точно также можно было бы выбрать любой другой метод, видимый коду, создающему поток — до тех пор, пока он не принимает и не возвращает параметров. Обратите внимание, что в коде также выводится идентификатор управляемого потока, причем двумя разными способами, демонстрируя возможности идентификации потоков в мире управляемых приложений. В неуправляемом мире С++ должен использоваться идентификатор потока, полученный через УУ!п32 АР1. В управляемом мире .НЕТ 1.1 вместо этого применяется значение, возвращенное методом Сегназпсобе.

До тех пор, пока поток существует, гарантируется, что он никогда не вступит в конфликт с любым другим потоком в любом домене приложения данного процесса. Хеш-код потока не является глобально уникальным для всей системы. Начиная с .НЕТ 2.0, получить идентификатор управляемого потока можно с помощью свойства Тпгеаб. Мападебтпгеаб1б. Кроме того, в коде показано, что для получения ссылки на текущий поток необходимо обратиться к статическому свойству Тпгеаб.СцггепГТпгеаб. И,наконец, обратите вниманиена вызов метода,то1п объекта пентнгеаб. В "родном" коде уу1п32 ожидание завершения потока обычно осуществляется по его дескриптору.

Когда поток завершает работу, операционная система выдает сигнал его дескриптору и ожидание прекращается. Эта функциональность инкапсулируется в методе Тлгеаб ..то1п. В данном случае код ждет завершения потока вечно. Для Тпгеаб. Юогп также предусмотрено несколько перегрузок, которые позволяют указать время ожидания. На заметку! В документации МЗРМ существует некоторая путаница относительно необходимости вызова тнгеаб. Сегнаэпсобе или доступа к свойству тпгеаб. мападебтнгеаб1б. Если вы внимательно почитаете документацию МЗОМ, то обнаружите на итоговой странице о 5узгеп.

тнгеаб замечание о том, что бегназпсобе — это средство получения уникального идентификатора управляемого потока в то время, пока этот поток существует. Но если обратиться к описанию тпгеаб. СегназпСобе в документации, то там сказано, что для этого нужно использовать свойство Тпгеаб. Мападебтпгеаб1б. Отлаживая приведенное выше приложение с использованием нгпбпд из пакета Оеоцдд~пд Тоо!з 1ог г№пбочгз с отладочным расширением зоз.б11, обнаруживается, что значение, возвращаемое Сегназпсобе, и значение свойства Мападебтнгеаб1б берется иэ одного и того же места. Можно предположить, что Мападебтпгеаб1б делает код более читабельным, потому что более адекватно отображает суть. Но если разрабатывается приложений для .НЕТ 1.1, то, учитывая, что свойство мападебтнгеаб1б появилось в .ИЕТ 2.0, следует использовать 6есназнсобе.

Скорее всего, эта путаница в документации вскоре будет устранена, поскольку это очевидно просто ошибка. В общем случае лучше всегда полагаться на мзпадебтнгеаб1б, даже несмотря на то, что аегназпсобе возвращает то же самое значение. Далее в этой главе будет применяться мападебтпгеаб1б, а не Сегназпсобе, Отдельный поток после создания. как и любой другой, подчиняется правилам планировщика потоков системы. Однако иногда требуется создать поток, который должен иметь немного больший или немного меньший приоритет, когда алгоритм планировщика потоков будет решать, какой именно поток выполнять следующим.

Управлять приоритетом потока можно через свойство Тпгеаб. Рггог№су. Его значение можно корректировать во время выполнения потока, хотя подобная необходимость возникает довольно редко. Все потоки стартуют с приоритетом Но гпа1, определенным в перечислении Тпгеабргьоггсу. 360 Глава ) 2 Передача данных новым потокам В управляемой среде класс Яувьеы.

ТЬгеас) замечательно инкапсулирует все операции, которые можно выполнять в потоке. При наличии некоторой информации о состоянии, которую необходимо передать новому потоку, чтобы она была доступной при его запуске, можно просто создать вспомогательный объект и инициализировать делегат ТЬгеабягагг, чтобы он ссылался на метод этого объекта. Вводом нового промежуточного уровня в форме класса также решается и другая проблема.

Предположим, что есть система, в которой заполняются несколько очередей задач, причем в некоторой точке требуется создать новый поток для обработки элементов переданной ему очереди. В следующем коде показан один из возможных способов решения этой задачи: ив1пд Яуясею) ия1пд Яуягеи.ТЬгеаб1пяг ив1пд Яуягею. Со11есС1опв) риЬ1гс с1авя Оиеиергосевяог ( риЬ1гс Оиеиергосеяяог( Сиене СЬебиеие ) ( ЬЬ1в.сЬебиеие = сЬебиеиев СЬеТЬгеаб = пен ТЬгеаб( пен ТЬгеабягагс(Свая,ТЬгеабуипс) ) рггчаге Циеие СЬеОиеие; рггчаге ТЬгеаб СЬеТЬгеас)г риЬ1гс ТЬгеас( ТЬеТЬгеаб ( дес ( гегигп СЬеТЬгеаб; ) ) риЬ1гс чогб Вед1ЬРгосеввпаоа() ( ГЬеТЬгеаб.явагс(); риЬ1гс чогб ЕпбРгосеввбага() ( СЬеТЬгеас(.Юо1п(); ) рг1чаге чогб ТЬгеас(Риис() здесь извлекать элементы СЬебиеие. ) риЬ11с с1авя епсгуроспг вгас1с нога Магп() Оиеие с(иеие1 =.пен Сиене()в Опеле с(иеие2 = пеи Сиене(); операции наполнения очередей данными.

// Обработка каждой очереди в отдельном потоке. Оиеиергосеввог ргос1 = пен Оиеиергосеяяог( Чиеие1 ргос1.Вея1пргосеввбага(); Оиеиергосеяяог ргос2 = пен Оиеиергосев*ог( Чиеие2 ргосу.вед1пргосеяяпага()в между тем выполнять какую-то другую работу. !/ Ожидать окончания работы. ргос1.Епс)ргосеввпага()в ргос2.ЕпбргосеяяРага(); Многопоточность з С№ 361 В коде присутствуют некоторые потенциальные проблемы, связанные с синхронизацией, если кто-то попытается обратиться к очередям после того, как новые потоки начнут работу.

Но пока обсуждение вопросов синхронизации откладывается — об этом пойдет речь позже в настоящей главе. Класс, добавляющий дополнительный промежуточный уровень обработки — это Оцепергосеззог. Он четко инкапсулирует рабочий поток и предоставляет легковесный интерфейс для выполнения работы.

В данном примере главный погон ожидает завершения, обращаясь к епбр осезэРаса. Этот метод просто вызывает ботп на инкапсулированном потоке. Однако если понадобятся некоторого рода данные о состоянии. связанные с завершенной работой, то получить их можно с помощью метода ЕпбРгосеззпага. Использование Раг(шейхи.кес1тЬкеасИ~аг~ Тем из вас, кто знаком с встроенными потоками %(г(п32. известно, что можно предоставить функцию потока. принимаюшую единственный параметр, через который передается начальное состояние потока. В Бузгеш. ТЬгеас(1пп.

тпгеаб есть перегруженная версия конструктора, позволяющая указать делегат типа Рагашесг1эес(тЬгеаг(Бсагс, который представляет собой делегат, принимающий единственную ссылку оьбесс и возвращающий чотс(. Однако обратите внимание, что поскольку параметр передается в экземпляре оЬБесс, для использования он должен быть приведен к ожидаемому типу, что может стать причиной исключений времени выполнения, если не соблюдать мер предосторожности.

Если воспользоваться конструктором, принимающим делегат РагашеСгтгебТЬгеабБСагг,то предыдущий пример можно переделать следующим образом: цэтпч Буэгешг цзтпд Буэгеш,тпгеаг(тпс) цетлин Бузгеш.со11есе1опе) рцЪ11с с1азэ ЕпггуРотпе ! згагтс чотб Матп() Очесе Чцеце1 = пен Оцеце() Очесе Чцеце2 = пен спеце О операции наполнения очередей данными. // Обработка каждой очереди з отдельном потоке. ТЬгеаб ргос1 = пен ТЬгеаб( ЕпггуРо1пг.тпгеас(рцпс ); ргос1.Бсагс( Чцеце1 )) ТЬгеаб ргос2 пен ТЬгеас(( Епггуротпс.ТЬгеабгцпс ); ргос2.БСагг( г(цеце2 ); // ...

Характеристики

Тип файла
DJVU-файл
Размер
8,22 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Нэш Трей - C# 2010
Accelerated_C_2010-4565
3_syntax_overview
3_generics_1.cs
as_1.cs
boxing.cs
conversions_1.cs
implicit_type_1.cs
is_1.cs
references_1.cs
references_2.cs
references_3.cs
values_1.cs
4_classes_structs
4_abstract_classes_1.cs
4_beforefieldinit_1.cs
4_box_1.cs
4_box_2.cs
4_box_3.cs
4_box_4.cs
4_box_5.cs
4_class_definition_1.cs
4_compareto_1.cs
4_containment_example_1.cs
4_containment_example_2.cs
4_containment_example_3.cs
4_ctor_struct_1.cs
4_ctor_struct_2.cs
4_ctor_struct_3.cs
4_destructor_1.cs
4_destructor_2.cs
Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
7056
Авторов
на СтудИзбе
258
Средний доход
с одного платного файла
Обучение Подробнее