русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Завершение потоков


Дата добавления: 2015-07-09; просмотров: 568; Нарушение авторских прав


§ Первый вариант остановки потока тривиален. Поток завершается после выполнения ПОСЛЕДНЕГО оператора выполняемой цепочки операторов. Допустим, в ходе выполнения условного оператора значение некоторой переменной сравнивается с фиксированным значением и в случае совпадения значений управление передаётся оператору return:

 

for (x=0;;x++)

{

if (x==max)

return; // Всё. Этот оператор оказался последним.

else

{

::::::::::

}

}

 

§ Поток может быть остановлен в результате выполнения метода Abort(). Эта остановка является достаточно сложным делом.

1. При выполнении этого метода происходит активация исключения ThreadAbortException. Естественно, это исключение может быть перехвачено в соответствующем блоке catch. Во время обработки исключения допустимо выполнение самых разных действий, которые осуществляются в этом самом “остановленном” потоке. В том числе, возможна и реанимация остановленного потока путём вызова метода ResetAbort().

2. При перехвате исключения CLR обеспечивает выполнение операторов блоков finally, которые выполняются всё в том же потоке.

Таким образом, остановка потока путём вызова метода Abort не может рассматриваться как НЕМЕДЛЕННАЯ остановка выполнения потока.

 

using System;

using System.Threading;

 

public class ThreadWork

{

public static void DoWork()

{

int i;

 

try

{

for(i=0; i<100; i++)

{

//4. Вот скромненько так работает...

// Поспит немножко - а потом опять поработает.

// Take Your time! 100 раз прокрутиться надо

// вторичному потоку до нормального завершения.

Console.WriteLine("Thread – working {0}.", i);

Thread.Sleep(10);

}

}

catch(ThreadAbortException e)

{

//6.

//- Ну дела! А где это мы...

Console.WriteLine("Thread - caught ThreadAbortException - resetting.");



Console.WriteLine("Exception message: {0}", e.Message);

// (Голос сверху)

//- Вы находитесь в блоке обработки исключения, связанного с

// непредвиденным завершением потока.

//- Понятно… Значит, не успели. "Наверху" сочли нашу деятельность

// Нецелесообразной и не дали (потоку) завершить до конца начатое дело!

Thread.ResetAbort();

// (Перехватывают исключение и отменяют остановку потока)

// Будем завершать дела. Но будем делать это как положено,

// а не в аварийном порядке. Нам указали на дверь, но мы

// уходим достойно!

// (Комментарии постороннего)

// А чтобы стал понятен альтернативный исход - надо

// закомментировать строку с оператором отмены остановки потока.

}

finally

{

//7.

//- Вот где бы мы остались, если бы не удалось отменить

// остановку потока! finally блок... Отстой!

Console.WriteLine("Thread - in finally statement.");

}

 

//8.

// - А вот преждевременный, но достойный уход.

// Мы не довели дело до конца только потому, что нам не дали

// сделать этого. Обстоятельства бывают выше. Уходим достойно.

Console.WriteLine("Thread - still alive and working.");

Console.WriteLine("Thread - finished working.");

}

}

 

class ThreadAbortTest

{

public static void Main()

{

//1. Мероприятия по организации вторичного потока!

ThreadStart myThreadDelegate = new ThreadStart(ThreadWork.DoWork);

Thread myThread = new Thread(myThreadDelegate);

//2. Вторичный поток стартовал!

myThread.Start();

 

//3. А вот первичный поток - самоусыпился!

// и пока первичный поток спит, вторичный поток - работает!

Thread.Sleep(50);

 

//5. Но вот первичный поток проснулся - и первое, что он

// делает - это прерывает вторичный поток!

Console.WriteLine("Main - aborting my thread.");

myThread.Abort();

 

//9. А в столицах тоже все дела посворачивали...

Console.WriteLine("Main ending.");

}

}

 



<== предыдущая лекция | следующая лекция ==>
Приостановка выполнения потока | Метод Join()


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 1.229 сек.