|
Программирование >> Обработка исключительных ситуаций
Листинг 10.10 (продолжение) Thread ta = new ThreadC new ThreadStart(Hedgehog) ); Console.WriteLineC торичн1й поток + ta.GetHashCodeC) ); ta.StartC); for ( int i = 0; i > -6: --i ) Console.WriteC + i ); Thread.SleepC 400 ); Результат работы программы: Первичн1й поток 1 Вторичный поток 2 0 0 -1 -2 1 -3 -4 2 -5 3 4 5 В листинге используется метод Sleep, останавливающий функционирование потока на заданное количество миллисекунд. Как видите, оба потока работают одновременно. Если бы они работали с одним и тем же файлом, он был бы испорчен так же, как и приведенный вывод на консоль, поэтому такой способ распараллеливания вычислений имеет смысл только для работы с различными ресурсами. В табл. 10.2 перечислены основные элементы класса Thread. Таблица 10.2. Основные элементы класса Thread Элемент Описание CurrentThread IsAlive IsBackground Name Priority ThreadState Abort GetData, SetData GetDomain, GetDomainID Статическое Возвращает сс1лку на выполняющийся поток (только свойство ,для чтения) Свойство Возвращает true или false в зависимости от того, запущен поток или нет Свойство Возвращает или устанавливает значение, которое показывает, является ли этот поток фоновым Свойство Установка текстового имени потока Свойство Получить/установить приоритет потока (используются значения перечисления ThreadPrority) Свойство Возвращает состояние потока (используются значения перечисления ThreadState) Метод Генерирует исключение ThreadAbortException. Вызов этого метода обычно завершает работу потока Статические Возвращает (устанавливает) значение ддля указанного методд! слота в текущем потоке Статические Возвращает ссылку на домен приложения (идентификатор м-юды домена приложения), в рамках которого работает поток Элемент Описание GetHashCode Sleep Interrupt Join Resume Start Suspend Метод Статический метод Метод Метод Метод Метод Метод Возвращает хеш-код для потока Приостанавливает выполнение текущего потока на заданное количество миллисекунд Прерывает работу текущего потока Блокирует вызывающий поток до завершения другого потока или указанного промежутка времени и завершает поток Возобновляет работу после приостановки потока Начинает выполнение потока, определенного делегатом ThreadStart Приостанавливает выполнение потока. Если выполнение потока уже приостановлено, то игнорируется Можно создать несколько потоков, которые будут совместно использовать один и тот же код. Пример приведен в листинге 10.11. Листинг 10.11. Потоки, использующие один объект using System; using System.Threading; namespace ConsoleApplicationi class Classl { public void Do() for ( int i - 0: i < 4; ++i ) { Console.Write( + i ); Thread.SIeep( 3 ); } class Program { static void MainO Classl a = new ClassK) ; Thread tl = new Thread( new ThreadStartC a.Do ) ); tl.Name = SecondO Console.WriteLineC Поток + tl.Name ); tl.StartO; Thread t2 = new ThreadC new ThreadStartC a.Do ) ); t2.Name = Third : Console.WriteLineC Поток + t2.Name ); t2.Start(); Асинхронные делегаты Делегат можно вызвать на выполнение либо синхронно, как во всех приведенных ранее примерах, либо асинхронно с помощью методов Beginlnvoke и Endlnvoke. При вызове делегата с помощью метода Beginlnvoke среда выполнения создает для исполнения метода отдельный поток и возвращает управление оператору, следующему за вызовом. При этом в исходном потоке можно продолжать вычисления. Если при вызове Beginlnvoke был указан метод обратного вызова, этот метод в1з1-вается после завершения потока. Метод обратного вызова также задается с помощью делегата, при этом используется стандартный делегат AsyncCal 1 back. В методе, обратного вызова для получения возвращаемого значения и выходных параметров применяется метод Endlnvoke. j j Результат работы программы: Поток Second Поток Third 0 0 1 1 2 2 3 3 Варианты вывода могут несколько различаться, поскольку один поток прерывает выполнение другого в неизвестные моменты времени. Для того чтобы блок кода мог использоваться в каждый момент только одним потоком, применяется оператор lock. Формат оператора: lock ( выражение ) блок операторов Выражение определяет объект, который требуется заблокировать. Для обычных методов в качестве выражения используется ключевое слово this, для статических - typeof (класс). Блок операторов задает критическую секцию кода, которую требуется заблокировать. Например, блокировка операторов в приведенном ранее методе Do выглядит следующим образом: public void Do() { lockC this ) for ( int i = 0; i < 4; ++i ) { Console.Write( + i ): Thread.SIeep( 30 ): } Для такого варианта метода результат работы программы изменится: Поток Second Поток Third 0 12 3 0 12 3
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |