Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Safonov / AMPN_course_21.pptx
Скачиваний:
139
Добавлен:
16.04.2015
Размер:
215.69 Кб
Скачать

Синхронизированный контекст

Атрибут SynchronizationAttribute для класса,

унаследованного от ContextBoundObject

 

Синхронизированные методы и данные

 

экземпляра

 

Статические методы и данные не

 

синхронизированы

[Synchronization]

class CounterSynchronizedContext : ContextBoundObject

{

 

static int sCount = 0; // multiple threads can access

int iCount = 0; // only one thread can access at a time

public void Increment() {

//… only one thread can access at a time

}

 

}

 

 

(C) Сафонов В.О. 2012

Синхронизированные регионы кода

Атрибут MethodImplAttribute с параметром

MethodImplOptions.Synchronized

[MethodImplAttribute(MethodImplOptions.Synchronized)]

 

Гарантирует вызов только из одного потока

 

Для статических методов и методов

 

экземпляра

Аналогичен использованию lock для всего

 

метода

Класс Monitor синхронизированный

доступ к фрагменту кода

 

Monitor.Enter, Monitor.TryEnter и Monitor.Exit

 

Использование ключевого слова lock языка C#

 

lock(this) для защиты экземпляра

 

lock(typeof(class)) для защиты класса

 

lock (typeof(Counter)) {

 

// block of protected code

 

}

 

(C) Сафонов В.О. 2012

Синхронизация “вручную”

Класс Interlocked для синхронизации атомарного доступа

CompareExchange, Decrement,

Exchange, Increment

Управление данными в совместно используемой памяти

Класс Mutex синхронизация процессов

ReaderWriterLock

синхронизированный доступ для записи

Проблема “один писатель / много читателей”

(C) Сафонов В.О. 2012

Синхронизация и классы .NET

Framework

Public static – элементы класса МП- безопасны

Остальные: см. документацию

Коллекции по умолчанию не МП- безопасны

HashTable МП-безопасна только для схемы “один писатель / много читателей”

Для получения МП-безопасной коллекции:

Класс-обертка, содержащий методы синхронизации

Использование механизма lock

Сравните: В Java есть synchronized –

методы и операторы (механизм lock в C# очень сходен с ними)

(C) Сафонов В.О. 2012

Класс Timer

Класс Thread.Timer для периодического исполнения заданного кода

Основан на делегате

Threading.TimerCallback

Метод Change изменяет временной интервал

Метод Dispose освобождает ресурсы

Timer timer = new Timer(

new TimerCallback(CheckStatus), null, 0, 1000); // …

static void CheckStatus(Object state) { Console.WriteLine("Checking Status.");

}

(C) Сафонов В.О. 2012

Пул потоков (ThreadPool)

Используется для повышения эффективности

Класс ThreadPool

Метод QueueUserWorkItem

Делегат WaitCallback

Построен на базе платформы Win32

Не рекомендуется использовать пул потоков,

если:

Необходимо управлять приоритетами

Вероятно длительное исполнение

Необходимо поместить потоки в STA (Single-

Threaded Apartment)

Делегат IOCompletionCallback сигнализирует об успешном завершении

Поток обрабатывает полученные данные

Сравните: В Java введен класс ThreadGroup,

как способ сделать многопоточность более

структурированной

(C)Сафонов В.О. 2012

Асинхронное

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

Поддержка различными частями

.NET

I/O, сокеты, работа в сети, remoting, ASP.NET, Web-сервисы, обработка сообщений (MSMQ), делегаты

Шаблон проектирования

Унифицированная и безопасная программная модель

Классы, создаваемые пользователем, должны следовать данному шаблону

(C)Сафонов В.О. 2012

Шаблон проектирования

Вызывающий метод принимает решение о типе вызова:

Поддерживаемый серверомИли делегат в клиентской части

Вызывающий метод выполняет декомпозицию операции вызоваНачало вызова: передача параметров, затем старт

вызова

Интерфейс IAsyncResult используется для возврата

Когда операция завершена – получение результата

Несколько способов определения факта завершения операции

Callback–метод, вызываемый по завершении операции

Периодический опрос

IAsyncResult.IsCompleted

Вызов метода завершения – фактически возврат к синхронной модели вызова

Ожидание тайм-аута в свойстве

IAsyncResult.WaitHandle

(C) Сафонов В.О. 2012

Пример асинхронного чтения файла

Использование callback-механизма

Создание callback

AsyncCallback myCallback = new

AsyncCallback(this.OnReadDone);

Запуск операции

IAsyncResult ar = aStream.BeginRead(buffer, 0, buffer.Length, myCallback, (object)myState);

Получение результата с помощью callback

int byteCount = aStream.EndRead(ar); // data in buffer

(C) Сафонов В.О. 2012

Пример асинхронного чтения файла

Периодический опрос

Запуск операции

IAsyncResult ar =

aStream.BeginRead(buffer,0,

buffer.Length,

null,(object)myState);

while (!ar.IsCompleted)

{

// do whatever

}

int byteCount = aStream.EndRead(ar); // data in buffer

(C) Сафонов В.О. 2012

Соседние файлы в папке Safonov