Герберт Шилдт - C# 4.0: полное руководство
- Название:C# 4.0: полное руководство
- Автор:
- Жанр:
- Издательство:ООО И.Д. Вильямс
- Год:2011
- Город:Москва -- Киев
- ISBN:978-5-8459-1684-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Герберт Шилдт - C# 4.0: полное руководство краткое содержание
В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки.
Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию
C# 4.0: полное руководство - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Console.WriteLine("Прерывание потока.");
mt1.Thrd.Abort();
mt1.Thrd.Join(); // ожидать прерывания потока
Console.WriteLine("Основной поток прерван.");
}
}
Вот к какому результату приводит выполнение этой программы.
Мой Поток начат.
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
Прерывание потока.
Основной поток прерван.
-----------------------------
ПРИМЕЧАНИЕ
Метод Abort() не следует применять в качестве обычного средства прерывания потока, поскольку он предназначен для особых случаев. Обычно поток должен завершаться естественным образом, чтобы произошел возврат из метода, выполняющего роль точки входа в него.
-----------------------------
В некоторых случаях оказывается полезной другая форма метода Abort(), приведенная ниже в общем виде:
public void Abort(object stateInfo)
где statelnfo обозначает любую информацию, которую требуется передать потоку, когда он останавливается. Эта информация доступна посредством свойства ExceptionState
из класса исключения ThreadAbortException
. Подобным образом потоку можно передать код завершения. В приведенном ниже примере программы демонстрируется применение данной формы метода Abort()
.
// Использовать форму метода Abort (object stateInfo) .
using System;
using System.Threading;
class MyThread {
public Thread Thrd;
public MyThread(string name) {
Thrd = new Thread(this.Run);
Thrd.Name = name;
Thrd.Start();
}
// Это точка входа в поток,
void Run() {
try {
Console.WriteLine(Thrd.Name + " начат.");
for (int i = 1; i <= 1000; i++) {
Console.Write(i + " ");
if((i%10)==0) {
Console.WriteLine();
Thread.Sleep(250);
}
}
Console.WriteLine(Thrd.Name + " завершен нормально.");
} catch(ThreadAbortException exc) {
Console.WriteLine("Поток прерван, код завершения "
+ exc.ExceptionState);
}
}
}
class UseAltAbort {
static void Main() {
MyThread mt1 = new MyThread("Мой Поток");
Thread.Sleep(1000);
// разрешить порожденному потоку начать свое выполнение
Console.WriteLine("Прерывание потока.");
mt1.Thrd.Abort(100);
Console.WriteLine("Основной поток прерван.");
}
}
Эта программа дает следующий результат.
Мой Поток начат.
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
Прерывание потока.
Поток прерван, код завершения 100
Основной поток прерван.
Как следует из приведенного выше результата, значение 100 передается методу Abort() в качестве кода прерывания. Это значение становится затем доступным посредством свойства ExceptionState из класса исключения ThreadAbortException, которое перехватывается потоком при его прерывании.
Запрос на преждевременное прерывание может быть переопределен в самом потоке. Для этого необходимо сначала перехватить в потоке исключение ThreadAbortException
, а затем вызвать метод ResetAbort()
. Благодаря этому исключается повторное генерирование исключения по завершении обработчика исключения, прерывающего данный поток. Ниже приведена форма объявления метода ResetAbort()
.
public static void ResetAbort()
Вызов метода ResetAbort()
может завершиться неудачно, если в потоке отсутствует надлежащий режим надежной отмены преждевременного прерывания потока.
В приведенном ниже примере программы демонстрируется применение метода ResetAbort()
.
// Использовать метод ResetAbort().
using System;
using System.Threading;
class MyThread {
public Thread Thrd;
public MyThread(string name) {
Thrd = new Thread(this.Run);
Thrd.Name = name;
Thrd.Start();
}
// Это точка входа в поток,
void Run() {
Console.WriteLine(Thrd.Name + ".начат.");
for (int i = 1; i<=1000; i++) {
try {
Console.Write(i + " ");
if((i %10)==0) {
Console.WriteLine();
Thread.Sleep(250);
}
} catch(ThreadAbortException exc) {
if((int)exc.ExceptionState ==0) {
Console.WriteLine("Прерывание потока отменено! " +
"Код завершения " + exc.ExceptionState);
Thread.ResetAbort();
}
else
Console.WriteLine("Поток прерван, код завершения "
+ exc.ExceptionState);
}
}
Console.WriteLine(Thrd.Name + " завершен нормально.");
}
}
class ResetAbort {
static void Main() {
MyThread mt1 = new MyThread("Мой Поток");
Thread.Sleep(1000); // разрешить порожденному потоку начать свое выполнение
Console.WriteLine("Прерывание потока.");
mt1.Thrd.Abort(0); // это не остановит поток
Thread.Sleep(1000); // разрешить порожденному потоку выполняться подольше
Console.WriteLine("Прерывание потока.");
mt1.Thrd.Abort(100); // а это остановит поток
mt1.Thrd.Join(); // ожидать прерывания потока
Console.WriteLine("Основной поток прерван.");
}
}
Ниже приведен результат выполнения этой программы.
Мой Поток.начат.
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
Прерывание потока.
Прерывание потока отменено! Код завершения 0
41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80
Прерывание потока.
Поток прерван, код завершения 100
Основной поток прерван.
Если в данном примере программы метод Abort()
вызывается с нулевым аргументом, то запрос на преждевременное прерывание отменяется потоком, вызывающим метод ResetAbort()
, и выполнение этого потока продолжается. Любое другое значение аргумента приведет к прерыванию потока.
Интервал:
Закладка: