Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LR_8_Tekhnologia_programmirovania.docx
Скачиваний:
72
Добавлен:
20.03.2016
Размер:
41.27 Кб
Скачать

Лабораторная работа №8. Разработка многопоточных приложений

1. Цель работы

Изучить методы и средства, пространства имен и классы, применяемые при работе с потоками в среде .NET Framework. Получить практические навыки разработки многопоточных приложений на языке C#.

2. Сведения из теории

2.1. Общие сведения по работе с потоками

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

Различают два вида многозадачности: с ориентацией на процессы и с ориентацией на потоки. Процесс по сути представляет собой выполняемую программу. Следовательно, многозадачность, ориентированная на процессы, – это средство, позволяющее компьютеру выполнять две или больше программ одновременно.

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

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

В среде .NET Framework определено два типа потоков: высокоприоритетный (foreground) и низкоприоритетный, или фоновый (background). По умолчанию поток создается высокоприоритетным, но его тип можно изменить, т.е. сделать фоновым. Единственное различие между высоко- и низкоприоритетным потоками состоит в том, что последний будет автоматически завершен, если все высокоприоритетные потоки в его процессе остановились.

Все процессы имеют по крайней мере один поток управления, который обычно называется основным, поскольку именно с этого потока начинается выполнение программы. Из основного можно создать и другие потоки. Желательно (но не обязательно), чтобы в многопоточной программе основной поток выполнялся последним.

Классы, которые поддерживают многопоточное программирование, определены в пространстве имен System.Threading.

Многопоточная система C# встроена в класс Thread, который инкапсулирует поток управления. Класс Thread является sealed-классом, т.е. он не может иметь наследников. В классе Thread определен ряд методов и свойств для управления потоками.

Чтобы создать поток, необходимо создать объект типа Thread. В классе Thread определен следующий конструктор:

public Thread(ThreadStart entryPoint)

Здесь параметр entryPoint содержит имя метода, который будет вызван, чтобы начать выполнение потока. Тип ThreadStart – это делегат (ссылка на метод), определенный в среде .NET Framework:

public delegate void ThreadStart()

Итак, начальный метод должен иметь тип возвращаемого значения void и не принимать никаких аргументов.

Выполнение созданного потока не начнется до тех пор, пока не будет вызван метод Start(). Начавшись, выполнение потока будет продолжаться до тех пор, пока не завершится метод, заданный параметром entryPoint. Поэтому после выхода из этого метода выполнение потока автоматически завершится. Если попытаться вызвать метод Start() для потока, запущенного на выполнение, будет сгенерировано исключение типа ThreadStateException.

В классе Thread предусмотрено значительное число компонентов (как статических, так и обычных) для создания текущим потоком новых потоков, а также для приостановки, полной остановки и удаления указанного потока. Наиболее важные статические компоненты представлены в таблице:

Статический компонент

Назначение

CurrentThread

Это свойство только для чтения возвращает ссылку на поток, выполняемый в настоящее время

Sleep()

Приостанавливает выполнение текущего потока на указанное пользователем время

Обычные (нестатические) компоненты класса Thread приведены в следующей таблице:

Компонент

Назначение

IsAlive

Возвращает true или false в зависимости от того, запущен поток или нет

IsBackground

Определяет, является ли поток фоновым

Name

Текстовое имя потока

Priority

Позволяет получить/установить приоритет потока (используются значения из перечисления ThreadPriority)

ThreadState

Возвращает информацию о состоянии потока (используются значения из перечисления ThreadState)

Interrupt()

Прерывает работу текущего потока

Join()

Ждет появления другого потока (или указанный промежуток времени) и завершается

Resume()

Продолжает работу после приостановки работы потока

Start()

Начинает выполнение потока, определенного делегатом ThreadStart

Suspend()

Приостанавливает выполнение потока. Если выполнение потока уже приостановлено, то игнорируется

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]