Чтение онлайн

на главную - закладки

Жанры

C# 4.0 полное руководство - 2011

Шилдт Герберт

Шрифт:

// Использовать блокируемые операции.

using System;

using System.Threading;

// Общий ресурс, class SharedRes {

public static int Count = 0;

// В этом потоке переменная SharedRes.Count инкрементируется, class IncThread { '

public Thread Thrd;

public IncThread(string name) {

Thrd = new Thread(this.Run);

Thrd.Name = name;

Thrd.Start;

}

//

Точка входа в поток, void Run {

for(int i=0; i<5; i++) {

Interlocked.Increment(ref SharedRes.Count);

Console.WriteLine(Thrd.Name + " Count = " + SharedRes.Count);

}

}

}

// В этом потоке переменная SharedRes.Count декрементируется, class DecThread { public Thread Thrd;

public DecThread(string name) {

Thrd = new Thread(this.Run);

Thrd.Name = name;

Thrd.Start;

}

// Точка входа в поток, void Run {

for(int i=0; i<5; i++) {

Interlocked.Decrement(ref SharedRes.Count);

Console.WriteLine(Thrd.Name + " Count = " + SharedRes.Count);

}

}

}

class InterlockedDemo { static void Main {

// Сконструировать два потока.

IncThread mtl = new IncThread("Инкрементирующий Поток"); DecThread mt2 = new DecThread("Декрементирующий Поток");

mtl.Thrd.Join; mt2.Thrd.Join;

}

}

Классы синхронизации, внедренные в версии .NET Framework 4.0

Рассматривавшиеся ранее классы синхронизации, в том числе Semaphore и AutoResetEvent, были доступны в среде .NET Framework, начиная с версии 1.1.

Таким образом, эти классы образуют основу поддержки синхронизации в среде .NET Framework. Но после выпуска версии .NET Framework 4.0 появился ряд новых альтернатив этим классам синхронизации. Все они перечисляются ниже.

Класс

Назначение

Barrier

Вынуждает потоки ожидать появления всех остальных пото

ков в указанной точке, называемой барьерной

CountdownEvent

Выдает сигнал, когда обратный отсчет завершается

ManualResetEventSlim

Это упрощенный вариант класса ManualResetEvent

semaphoreslim

Это упрощенный вариант класса Semaphore

Если

вам понятно, как пользоваться основными классами синхронизации, описанными ранее в этой главе, то у вас не должно возникнуть затруднений при использовании их новых альтернатив и дополнений.

Прерывание потока

Иногда поток полезно прервать до его нормального завершения. Например, отладчику может понадобиться прервать вышедший из-под контроля поток. После прерывания поток удаляется из системы и не может быть начат снова.

Для прерывания потока до его нормального завершения служит метод Thread. Abort . Ниже приведена простейшая форма этого метода.

public void Abort

Метод Abort создает необходимые условия Для генерирования исключения ThreadAbortException в том потоке, для которого он был вызван. Это исключение приводит к прерыванию потока и может быть перехвачено и в коде программы, но в этом случае оно автоматически генерируется еще раз, чтобы остановить поток. Метод Abort не всегда способен остановить поток немедленно, поэтому если поток требуется остановить перед тем, как продолжить выполнение программы, то после метода Abort следует сразу же вызвать метод Join . Кроме того, в самых редких случаях методу Abort вообще не удается остановить поток. Это происходит, например, в том случае, если кодовый блок finally входит в бесконечный цикл.

В приведенном ниже примере программы демонстрируется применение метода Abort для прерывания потока.

// Прервать поток с помощью метода Abort.

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++) {

Console.Write(i + " "); if((i %10)==0) {

Console.WriteLine;

Thread.Sleep(250);

}

}

Console .WriteLine (Thrd.Name + 11 завершен.");

}

}

class StopDemo {

static void Main {

MyThread mtl = new MyThread("Мой Поток");

Thread.Sleep (1000); // разрешить порожденному потоку начать свое выполнение

Console.WriteLine("Прерывание потока."); mtl.Thrd.Abort;

mtl.Thrd.Join; // ожидать прерывания потока Console.WriteLine("Основной поток прерван.");

}

}

Вот к какому результату приводит выполнение этой программы.

Прерывание потока.

Поделиться:
Популярные книги

Кодекс Охотника. Книга XV

Винокуров Юрий
15. Кодекс Охотника
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XV

Плохой парень, Купидон и я

Уильямс Хасти
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Плохой парень, Купидон и я

Убивать чтобы жить 8

Бор Жорж
8. УЧЖ
Фантастика:
боевая фантастика
космическая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 8

Барон ненавидит правила

Ренгач Евгений
8. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Барон ненавидит правила

Надуй щеки! Том 3

Вишневский Сергей Викторович
3. Чеболь за партой
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Надуй щеки! Том 3

Русь. Строительство империи

Гросов Виктор
1. Вежа. Русь
Фантастика:
альтернативная история
рпг
5.00
рейтинг книги
Русь. Строительство империи

Фею не драконить!

Завойчинская Милена
2. Феями не рождаются
Фантастика:
юмористическая фантастика
5.00
рейтинг книги
Фею не драконить!

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

Сирота

Ланцов Михаил Алексеевич
1. Помещик
Фантастика:
альтернативная история
5.71
рейтинг книги
Сирота

Попытка возврата. Тетралогия

Конюшевский Владислав Николаевич
Попытка возврата
Фантастика:
альтернативная история
9.26
рейтинг книги
Попытка возврата. Тетралогия

Возвышение Меркурия. Книга 7

Кронос Александр
7. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 7

Дракон - не подарок

Суббота Светлана
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Дракон - не подарок

Убивать чтобы жить 9

Бор Жорж
9. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать чтобы жить 9

Газлайтер. Том 2

Володин Григорий
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2