Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка для КР по ООП.doc
Скачиваний:
8
Добавлен:
18.04.2019
Размер:
2.47 Mб
Скачать

Обзор пространства имён System.Threading

В этом пространстве объявляются типы, которые используются для создания многопоточных приложений: работа с потоком, средства синхронизации доступа к общим данным, примитивный вариант класса Timer… Много всего!

Тип

Назначение

Interlocked

Синхронизация доступа к общим данным.

Monitor

Синхронизация потоковых объектов при помощи блокировок и управления ожиданием.

Mutex

Синхронизация ПРОЦЕССОВ.

Thread

Собственно класс потока, работающего в среде выполнения .NET. В текущем домене приложения с помощью этого класса создаются новые потоки.

ThreadPool

Класс, предоставляющий средства управления набором взаимосвязанных потоков.

ThreadStart

Класс-делегат для метода, который должен быть выполнен перед запуском потока.

Timer

Вариант класса-делегата, который обеспечивает передачу управления некоторой функции-члену (неважно какого класса!) в указанное время. Сама процедура ожидания выполняется потоком в пуле потоков.

TimerCallback

Класс-делегат для объектов класса Timer.

WaitHandle

Объекты-представители этого класса являются объектами синхронизации (обеспечивают многократное ожидание).

WaitCallback

Делегат, представляющий методы для рабочих элементов (объектов) класса ThreadPool

Многопоточность

МНОГОПОТОЧНАЯ ОС. Прежде всего, операционная система должна допускать параллельную (псевдопараллельную) работу нескольких программ.

Многопоточное приложение: отдельные компоненты работают одновременно (псевдоодновременно), не мешая друг другу.

Случаи использования многопоточности:

  • выполнение длительных процедур, ходом выполнения которых надо управлять,

  • функциональное разделение программного кода: пользовательский интерфейс – функции обработки информации,

  • обращение к серверам и службам Инернета, базам данных, передача данных по сети,

  • одновременное выполнение нескольких задач, имеющих различный приоритет.

Виды многопоточности

  • Переключательная многопоточность. Основа – резидентные программы. Программа размещалась в памяти компа вплоть до перезагрузки системы и управление ей передавалось каким-либо заранее согласованным способом (предопределённой комбинацией клавиш на клавиатуре).

  • Совместная многопоточность. Передача управления от одной программы другой. При этом возвращение управления – это проблема выполняемой программы. Возможность блокировки, при которой аварийно завершаются ВСЕ программы.

  • Вытесняющая многопоточность. ОС централизованно выделяет всем запущенным приложениям определённый квант времени для выполнения в соответствии с приоритетом приложения. Реальная возможность работы нескольких приложений в ПСЕВДОПАРАЛЛЕЛЬНОМ режиме. “Зависание” одного приложения не является крахом для всей системы и оставшихся приложений.

А кто в домене живёт…

Прилагаемый пример демонструрует методы анализа процесса, домена и потоков.

Показывает потоки в процессе, а также сборки, которые выполняются в домене приложения.

using System;

using System.Windows.Forms;

// Это пространство имён требуется для работы с классом Assembly.

using System.Reflection;

// Это пространство имён требуется для работы с классом Process.

using System.Diagnostics;

namespace AppDomain1

{

class MyAppDomain

{

public static void ShowThreads()

{

Process proc = Process.GetCurrentProcess();

foreach(ProcessThread aPhysicalThread in proc.Threads)

{

Console.WriteLine(aPhysicalThread.Id.ToString() + “:” + aPhysicalThread.ThreadState);

}

}

public static void ShowAssemblies()

{

// Получили ссылку на домен.

AppDomain ad = AppDomain.CurrentDomain;

// В рамках домена может быть множество сборок.

// Можно получить список список сборок домена.

Assembly[] loadedAssemblies = ad.GetAssemblies();

// У домена имеется FriendlyName, которое ему присваивается

// при создании. При этом у него даже нет доступного конструктора.

Console.WriteLine(“Assemblies in {0} domain:”, ad.FriendlyName);

foreach(Assembly assembly in loadedAssemblies)

{

Console.WriteLine(assembly.FullName);

}

}

static void Main(string[] args)

{

Console.WriteLine(“=========================”);

// MessageBox.Show(“XXX”); - Это всего лишь вызов метода класса MessageBox.

// Вызов выполняется лишь потому, что в домен с самого начала

// загружается сборка System.Windows.Forms.dll.

MessageBox.Show(“XXX”);

ShowThreads();

ShowAssemblies();

Console.WriteLine(“=========================”);

// Даже в таком простом приложении в рамках домена приложения живут три сборки!

}

}

}