Главная » Просмотр файлов » Г. Шилдт - С#4.0 Полное руководство

Г. Шилдт - С#4.0 Полное руководство (1160795), страница 179

Файл №1160795 Г. Шилдт - С#4.0 Полное руководство (Г. Шилдт - С#4.0 Полное руководство) 179 страницаГ. Шилдт - С#4.0 Полное руководство (1160795) страница 1792019-09-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

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

А до тех пор в приведенных далее примерах любые исключения, генерируемые задачами, будут обрабатываться во время выполнения. Ниже приведен вариант предыдущей программы, измененный с целью продемонстрировать применение метода Хагб () на практике. Этот метод используется внутри метода маги (), чтобы приостановить его выполнение до тех пор, пока не завершатся обе задачи СзК и СзК2. Применить метод иаьг () . овгпд Зувгеяч овьпд Зувсеш.Тбгеабьпдг ОВ1лд Зуясеш.ТЬгеабьпд.Таяхвг с1авв ПешоТавК ( Метод, исполняемый как задача. всасгс чоьб МуТавх() ( Сопво1е.нгьгеЬ1пе("МуТавК() И'" е ТавК.Соггепс10 в " запущен"); 1ог(1пг соопс = 0; соопс < 10; соопс++) ( тигеаб.З1еер(500) 1 Сопво1е.нгьсеьнпе("В методе МуТаяК() ()" в Таях.соггепс10 е подсчет равен " + соопс )г ) Сопво1е.нгьсевгпе("МуТавК Э" т таях.соггепсгб + " завершен"); всагьс чо10 Маьп() ( Сопяо1е.игг1е11пе("Основной поток запущен.") Сконструировать объекты двух задач.

Таях Гвх = пен Таях(муТаяК); Таях гвК2 = пен Таях(МуТавК); Глава 24. Многопоточное программирование. Часть вторая: библиотека ТР(. 893 // Запустить задачи на исполнение. гя)г.зсагс()7 гякз.згагс()1 Сопво1е.нгтгеььпе("Идентификатор задачи Гаки " т Гял.1о)г сопяо1е.нгтгеььпе("идентификатор задачи сяи2: " т гяк2.1с)7 Приостановить выполнение метода Ма1п() до тех пор, пока не завершатся обе задачи Гя)г и Сял2 Ся)с.иа1С() ) гяк2.иа1г() 7 Сопяо1е.игьсевьпе("Основной поток завершен."); ) При выполнении этой программы получается следующий результат.

равен 9 Как следует из приведенного выше результата, выполнение метода Мафи () приостанавливается до тех пор, пока не завершатся обе задачи с я )г и ся)с2. Следует, однако, иметь в виду, что в рассматриваемой здесь программе последовательность завершения задач Ся)с и Ся)г2 не имеет особого значения для вызовов метода Магг () . Так, если первой завершается задача С з К2, то в вызове метода С з )г. Иа1С () будет по-прежнему ожидаться завершение задачи Ся)г.

В таком случае вызов метода Ся)г2. Иа1С () приведет к выполнению и немедленному возврату из него, поскольку задача Ся)42 уже завершена. Основной поток запущен идентификатор задачи гяк: 1 Идентификатор задачи Гял2: 2 Мутаял() И'1 запущен МуТаял() И'2 запушен В методе Мутаял() У1, подсчет В методе Мутаяк() И'2, подсчет В методе Иутаял() И'1, подсчет В методе Мутаял() У2, подсчет В методе Иутаял М И'1, подсчет В методе Иутаял() У2, подсчет В методе Мутаял() И 1, подсчет В методе МуТаял() У2, подсчет В методе МуТая)г() И'1, подсчет В методе МуТаял() У2, подсчет В методе Мутаял() У1, подсчет В методе ИуТаяв() У2, подсчет В методе ИуТаял() У1, подсчет В методе Мутаял() И'2, подсчет В методе Мутаяк() И'1, подсчет В методе Мутаяк() У2, подсчет В методе Мутая)г() У1, подсчет В методе Мутаял() И'2, подсчет В методе Мутаял() И'1, подсчет Иутаял У1 завершен В методе МуТаял() У2, подсчет Мутаяк У2 завершен Основной поток завершен.

равен 0 равен 0 равен 1 равен 1 равен 2 равен 2 равен 3 равен 3 равен 4 равен 4 равен 5 равен 5 равен б равен 6 равен 7 равен 7 равен 8 равен 8 равен 9 894 Часть (]. Библиотека С() В данном случае оказывается достаточно двух вызовов метода Иа1С (), но того же результата можно добиться и более простым способом, воспользовавшись методом Ха1СА11 () . Этот метод организует ожидание завершения группы задач.

Возврата из него не произойдет до тех пор, пока не завершатся все задачи. Ниже приведена простейшая форма объявления этого метода. рп)з11с ясасьс чо1д Ха1СА11(рясяяя Таял[] Саяна) Задачи, завершения которых требуется ожидать, передаются с помощью параметра в виде массива Сая)ся. А поскольку этот параметр относится к типу рагавя, то данному методу можно отдельно передать массив объектов типа тая)с или список задач. При этом могут быть сгенерированы различные исключения, включая и АддгедасеЕхсерс1оп. Для того чтобы посмотреть, как метод ХаьсА11 () действует на практике, замените в приведенной выше программе следующую последовательность вызовов. Сяк. Халс (); Сяк2.ияхС(); на таял.иахСА11(Сяк, Сях2); Программа будет работать точно так же, но логика ее выполнения станет более понятной.

Организуя ожидание завершения нескольких задач, следует быть особенно внимательным, чтобы избежать взаимоблокировок. Так, если две задачи ожидают завершения друг друга, то вызов метода Ха1СА11 () вообще не приведет к возврату из него. Разумеется, условия для взаимоблокировок возникают в результате ошибок программирования, которых следует избегать.

Следовательно, если вызов метода Ха1СА11 () не приводит к возврату из него, то следует внимательно проанализировать, могут ли две задачи или больше взаимно блокироваться. (Вызов метода Хаас (), который не приводит к возврату из него, также может стать причиной взаимоблокировок.) Иногда требуется организовать ожидание до тех пор, пока не завершится любая из группы задач. Для этой цели служит метод Иа1САп у () .

Ниже приведена простейшая форма его объявления. рпЫ1с яСасгс тпС Хягглпу(рягаяя Таял[] Сая)ся) Задачи, завершения которых требуется ожидать, передаются с помощью параметра в виде массива Саяхя объектов типа таял или отдельного списка аргументов типа таях. Этот метод возвращает индекс задачи, которая завершается первой. При этом могут быть сгенерированы различные исключения. Попробуйте применить метод Хатслпу () на практике, подставив в предыдущей программе следующий вызов. тяяк.иаьглпу(Сяк, Сяк2); Теперь, выполнение метода Иа1п () возобновится, а программа завершится, как только завершится одна из двух задач. Помимо рассматривавшихся здесь форм методов Иа1С (), ЯасСА11 () и ИасСАпу (), имеются и другие их варианты, в которых можно указывать период простоя или отслеживать признак отмены. (Подробнее об отмене задач речь пойдет далее в этой главе.) Глава 24.

Многопоточное программирование. Часть вторая: библиотека ТР). 895 Вызов метода Шврове () В классе Таях реализуется интерфейс 101ярояаЬ1е, в котором определяется метод О1ярояе () . Ниже приведена форма его объявления, рагс чзгс( Шярояе () Метод Отярояе () реализуетог в классе таях, освобождая ресурсы, используемые этим классом.

Как правило, ресурсы, связанные с классом таях, освобождаютсл автоматически во время "сборки мусора" (или по завершении программы). Но если эти ресурсы требуется освободить еще раньше, то для этой цели служит метод р1 яро я е ( ) . Это особенно важно в тех программах, где создается большое число задач, оставляемых на произвол судьбы. Следует, однако, иметь в виду, что метод Ртярояе () можно вызывать для отдельной задачи только после ее завершения. Следовательно, для выяснения факта завершения отдельной задачи, прежде чем вызывать метод Отярояе (), потребуется некоторый иеханизм, например, вызов метода матс () .

Именно поэтому так важно было рассмотреть метод иаъг (), перед тем как обсуждать метод Оъярояе () . Ели же попытаться вызвать О1ярояе () для все еще активной задачи, то будет сгенерировано исключение тпча11оОрегаггопЕхсерс1оп. Во всех примерах, приведенных в этой главе, создаются довольно короткие задачи, которые сразу же завершаются, и поэтому применение метода О1ярояе [) в этих примерах не дает никаких преимуществ.

(Именно по этой причине вызывать метод О1 яро яе ( ) в приведенных выше программах не было никакой необходимости. Ведь все они завершались, как только завершалась задача, что в конечном итоге приводило к освобождению о г остальных задач.) Но в целях демонстрации возможностей данного метода и во избежание каких-либо недоразумений метод Отярояе () будет вызываться явным образом при непосредственном обращении с экземпллрами объектов типа таях во всех последующих примерах программ. Если вы обнаружите отсутствие вызовов метода Ртярояе () в исходном коде, полученном из других источников, то не удивляйтесь этому.

Опять же, если программа завершается, как только завершится задача, то вызывать метод 01ярояе () нет никакого смысла — разве что в целях демонстрации его применения. Применение класса таеЕБ'ас~огу для запуска задачи Приведенные выше примеры программы были составлены не так эффективно, как следовало бы, поскольку задачу можно создать и сразу же начать ее исполнение, вызвав метод Бгагг(чеи (), определенный в классе Таяхрасгогу. В классе Таяхрассогу предоставляются различные методы, упрощающие создание задач и управление ими. По умолчанию объект класса Таяхрасгогу может быть получен из свойства рассогу, доступного только длл чтения в классе таях. Используя это свойство, можно вызнаешь любые методы класса таякрасгоху.

Метод ягагсыеи () существует во множестве форм. Ниже приведена самая простая форма его объявления: ряЫгс Таян ясагсиен(ьсс1оп ассгоп) где асг1оп — точка входа в исполнлемую задачу. Сначала в методе Бгагсыен () авто- матически создается экземпляр объекта типа Тая и для действия, определяемого па- раметром а с Стоп, а затем планируется запуск задачи на исполнение. Следовательно, необходимость в вызове метода ягагс П теперь отпадает, 896 Часть И. Библиотека Ся' Например, следующий вызов метода Бсагснем () в рассматривавшихся ранее программах приведет к созданию и запуску задачи свк одним действием. Тазк сзк = Тавк.Гастеву.згагонем(нутавк)с После этого оператора сразу же начнет выполняться метод МуТ аз и ( ) .

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

Лямбда-выражения оказываются особенно полезными в тех случаях, когда единственным назначением метода являетсл решение одноразовой задачи. Лямбда-выражения могут составлять отдельную задачу или же вызывать другие методы. Так или иначе, применение лямбда-выражения в качестве задачи может стать привлекательной альтернативой именованному методу.

В приведенном ниже примере программы демонстрируется применение лямбдавыражения в качестве задачи. В этой программе код метода МуТаз)с () из предыдущих примеров программ преобразуется в лямбда-выражение. Применить лямбда-выражение в качестве задачи. ов1пд Бувсешг овгпч Бувпеш.ТПгеаб1псн пв1пч Бузуев.ТПсеабьпд.Тавкв; с1авв РешоЬашббатавк ( всасьс чоьб Иаьп() ( Сопао1е.Хгьгепьпе("Основной поток запущен."); // Далее лямбда-выражение используется для определения задачи. Тавк Свк = Тавк.тасгогу.згаггуен( () е> ( Сопзо1е.игьсекьпе("Задача запущена" ); Гог(ьпс соопг = 0; соопс < 10; соопг++) ( Тьгеаб.Б1еер(500)г сопво1е.хгьсеььпе("подсчет в задаче равен " + соопс ) ) Сопзо1е.иггбеььпе("Задача завершена") ) )' /Л Отослать завершения задачи Св)с.

св)с. Хаьс (); // Освободить задачу Сзк. Сзк.бьврове()с Глава 24. Многопоточное программирование. Часть вторавч библиотека ТРЕ 897 сспяо1е.хг1сеь1пе("Основной поток завершен.") Ниже приведен результат выполнения этой программы. Основной лоток запушен. Задача запушена Подсчет в задаче равен О Подсчет в задаче равен 1 Подсчет в задаче равен 2 Подсчет в задаче равен 3 Подсчет в задаче равен 4 Подсчет в задаче равен 5 Подсчет в задаче равен б Подсчет в задаче равен 7 Подсчет в задаче равен В Подсчет в задаче равен 9 задача завершена Основной поток завершен. Помимо применения лямбда-выражения для описания задачи, обратите также внимание в данной программе на то, что вызов метода Сей.

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

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

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

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6552
Авторов
на СтудИзбе
299
Средний доход
с одного платного файла
Обучение Подробнее