- •Оглавление
- •Класс Thread. Общая информация.
- •Thread – составляющие
- •Свойства
- •1) В следующем примере кода показаны простейшие функциональные возможности работы с потоками.
- •2)Пример изменения и использования свойств Priotiry, Name, CurrentThread
- •3) Создание потоков в фоновом режиме. Использование свойства IsBackground.
- •4) Ключевое слово lock
- •Interrupt(), Sleep(), SpinWait(), Join()
- •Класс Process Общая информация.
- •Process – составляющие Свойства
- •Примеры:
- •Класс WaitHandle Общая информация.
- •WaitHandle – составляющие Поля
- •Свойства
- •Класс Mutex Общая информация.
- •Mutex – составляющие Свойства
- •Примеры
- •Класс AutoResetEvent Общая информация.
- •AutoResetEvent – составляющие Методы
- •Примеры
- •Класс ManualResetEvent Общая информация.
- •ManualResetEvent – составляющие Методы
- •Примеры
- •Класс Monitor Общая информация.
- •Monitor – составляющие Методы
- •Класс Semaphore
- •Список литературы
Примеры:
Демонстрация работы с классом Process (печатаем текстовый файл в отдельном процессе)
using System;
using System.Diagnostics;
using System.ComponentModel;
namespace MyProcessSample
{
/// <summary>
/// Пример
/// </summary>
class MyProcess
{
// Ошибки (родные виндовские)
const int ERROR_FILE_NOT_FOUND = 2;
const int ERROR_ACCESS_DENIED = 5;
/// <summary>
/// Печать файла с расширением .doc
/// </summary>
void PrintDoc()
{
Process myProcess = new Process();
try
{
// Путь к папочке “Мои документы”
string myDocumentsPath =
Environment.GetFolderPath(Environment.SpecialFolder.Personal);
// Настраиваем процесс на печать
myProcess.StartInfo.FileName = myDocumentsPath + "\\MyFile.doc";
myProcess.StartInfo.Verb = "Print";
myProcess.StartInfo.CreateNoWindow = true;
myProcess.Start();
}
// Обработка исключений
catch (Win32Exception e)
{
if (e.NativeErrorCode == ERROR_FILE_NOT_FOUND)
{
Console.WriteLine(e.Message + ". Check the path.");
}
else if (e.NativeErrorCode == ERROR_ACCESS_DENIED)
{
Console.WriteLine(e.Message +
". You do not have permission to print this file.");
}
}
}
// Главный процесс
public static void Main()
{
// Печать производим в отдельном процессе
MyProcess myProcess = new MyProcess();
myProcess.PrintDoc();
Console.Read();
}
}
}
Пример использования свойства ProcessorAffinity
int MyID;
int p = 2;//Номер логического процессора
private void ThreadToProcessor()
{
//Конфигурируем и запускаем поток
th = new System.Threading.Thread(new System.Threading.ThreadStart(ThCallBack));
th.Name = "Test_Thread";
th.Start();
ProcessThread ProcThr = null;
bool IsFound = false;
IntPtr proc;
Process currentProcess = Process.GetCurrentProcess();
//Получаем коллекцию потоков текущего процесса
ProcessThreadCollection theThreads = currentProcess.Threads;
for (int i=0;i<theThreads.Count;i++)
{
ProcThr = theThreads[i];
//Ищем нужный поток для запска его на другом ядре машины
if (ProcThr.Id == MyID)
{
IsFound = true;
break;
}
}
if (IsFound)
{
//Поток th работает на ядре p = 2
proc = new IntPtr(1<<(p-1));
ProcThr.ProcessorAffinity = proc;
}
}
private void ThCallBack()
{
MyID = AppDomain.GetCurrentThreadId();
while(true)
{
}
}
Класс WaitHandle Общая информация.
Описание:
Абстрактный класс, который инкапсулирует в себе средства для синхронизации доступа к разделяемым данным. Этими средствами являются классы Mutex, AutoResetEvent, ManualResetEvent (подробная информация о данных классах размещена в соответствующих разделах).
Этот класс используется в качестве базового для объектов синхронизации. Классы, производные от WaitHandle, определяют механизм сигналов для того, чтобы показать на изъятие или освобождение эксклюзивного доступа к общему ресурсу, но эти классы используют унаследованные методы от WaitHandle для блокирования во время ожидания доступа к общим ресурсам.
Следует использовать статические методы этого класса для блокирования потока до получения сигнала одним или более объектами синхронизации.
Иерархия:
System.Object System.MarshalByRefObject System.Threading.WaitHandle System.Threading.AutoResetEvent System.Threading.ManualResetEvent System.Threading.Mutex
Определение:
[C#]
public abstract class WaitHandle : MarshalByRefObject, IDisposable
Потокобезопасность:
Этот тип можно использовать в многопоточных операциях.