C# 4.0 полное руководство - 2011
Шрифт:
Классы, поддерживающие многопоточное программирование, определены в пространстве имен System. Threading. Поэтому любая многопоточная программа на C# включает в себя следующую строку кода.
using System.Threading;
Класс Thread
Система многопоточной обработки основывается на классе Thread, который инкапсулирует поток исполнения. Класс Thread является герметичным, т.е. он
Создание и запуск потока
Для создания потока достаточно получить экземпляр объекта типа Thread, т.е. класса, определенного в пространстве имен System.Threading. Ниже приведена простейшая форма конструктора класса Thread:
public Thread(ThreadStart запуск)
где запуск — это имя метода, вызываемого с целью начать выполнение потока, a ThreadStart — делегат, определенный в среде .NET Framework, как показано ниже.
public delegate void ThreadStart
Следовательно, метод, указываемый в качестве точки входа в поток, должен иметь возвращаемый тип void и не принимать никаких аргументов.
Вновь созданный новый поток не начнет выполняться до тех пор, пока не будет вызван его метод Start , определяемый в классе Thread. Существуют две формы объявления метода Start . Ниже приведена одна из них.
public void Start
Однажды начавшись, поток будет выполняться до тех пор, пока не произойдет возврат из метода, на который указывает запуск. Таким образом, после возврата из этого метода поток автоматически прекращается. Если же попытаться вызвать метод Start для потока, который уже начался, это приведет к генерированию исключения ThreadStateException.
В приведенном ниже примере программы создается и начинает выполняться новый поток.
// Создать поток исполнения.
using System;
using System.Threading;
class MyThread { public int Count; string thrdName;
public MyThread(string name) {
Count = 0; thrdName = name;
}
// Точка входа в поток, public void Run {
Console.WriteLine(thrdName + " начат.");
do {
Thread.Sleep(500);
Console.WriteLine("В
Count++;
} while(Count < 10);
Console.WriteLine(thrdName + " завершен.");
}
class MultiThread { static void Main {
Console.WriteLine("Основной поток начат.");
// Сначала сконструировать объект типа MyThread.
MyThread mt = new MyThread("Потомок #1");
// Далее сконструировать поток из этого объекта.
Thread newThrd = new Thread(mt.Run);
// И наконец, начать выполнение потока. newThrd.Start; do {
Console.Write(".");
Thread.Sleep(100);
} while (mt.Count != 10);
Console.WriteLine("Основной поток завершен.");
}
}
Рассмотрим приведенную выше программу более подробно. В самом ее начале определяется класс MyThread, предназначенный для создания второго потока исполнения. В методе Run этого класса организуется цикл для подсчета от 0 до 9. Обратите внимание на вызов статического метода Sleep , определенного в классе Thread. Этот метод обусловливает приостановление того потока, из которого он был вызван, на определенный период времени, указываемый в миллисекундах. Когда приостанавливается один поток, может выполняться другой. В данной программе используется следующая форма метода Sleep :
public static void Sleep(int миллисекунд_простоя)
где миллисекунд_простоя обозначает период времени, на который приостанавливается выполнение потока. Если указанное количество миллисекунд_простоя равно нулю, то вызывающий поток приостанавливается лишь для того, чтобы предоставить возможность для выполнения потока, ожидающего своей очереди.
В методе Main новый объект типа Thread создается с помощью приведенной ниже последовательности операторов.
// Сначала сконструировать объект типа MyThread.
MyThread mt = new MyThread("Потомок #1");
// Далее сконструировать поток из этого объекта.
Thread newThrd = new Thread(mt.Run);
// И наконец, начать выполнение потока. newThrd.Start;