Шаг 236.
Язык программирования C#. Начала.
Многопоточное программирование. Класс Thread и создание потоков

    На этом шаге мы рассмотрим назначение этого класса для создания потоков.

    Прежде чем приступить к рассмотрению вопросов, связанных с многопоточным программированием, имеет смысл уточнить, что же это такое. Вообще, потоками называются разные части программы, которые выполняются одновременно. Именно в одновременном выполнении нескольких блоков программного кода кроется "изюминка" многопоточного программирования. В языке C# предусмотрены простые и эффективные средства для реализации многопоточного способа программирования. С этими средствами мы намерены познакомиться.

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


Класс Thread определен в пространстве имен System.Threading. Класс Thread определен с инструкцией sealed. Это означает, что данный класс не может быть базовым для создания производных классов.

    Создание объекта потока не означает, что поток начинает выполняться. Для запуска потока на выполнение из объекта этого потока необходимо вызвать метод Start().


Если метод Start() вызывается из объекта потока, который уже запущен на выполнение, то генерируется исключение класса ThreadStateException.

    То есть здесь все относительно просто: создаем объект класса Thread и вызываем из этого объекта метод Start(). Но открытым остается вопрос о том, как связать объект потока с программным кодом, который должен выполняться в потоке. Такое "связывание" происходит на этапе создания объекта потока. Происходит это так: при создании объекта потока на основе класса Thread в качестве аргумента конструктору передается ссылка на экземпляр делегата ThreadStart. Предполагается, что экземпляр делегата содержит ссылку на метод или методы, которые будут вызваны при выполнении потока. Делегат ThreadStart определен для методов без аргументов, не возвращающих результат.


При создании объекта класса Thread аргументом конструктору можно передать ссылку на метод без аргументов, не возвращающий результат. Хотя формально аргументом конструктора должна быть ссылка типа ThreadStart, это работает. Принцип такой. Под аргумент конструктора выделяется переменная типа ThreadStart. Значением этой переменной присваивается ссылка на метод. В результате создается экземпляр делегата, который ссылается на метод, а ссылка на экземпляр присваивается переменной, выделенной под аргумент конструктора.

    Если мы хотим, чтобы в потоке выполнялось несколько методов (последовательно, один за другим), то имеет смысл создать экземпляр делегата ThreadStart, записать в него ссылки на соответствующие методы, а ссылку на экземпляр передать аргументом конструктору класса Thread (при создании объекта потока).


    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг