Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Межпроцессорное взаимодействие и многопоточность в .NET (реферат).docx
Скачиваний:
30
Добавлен:
28.06.2014
Размер:
139.35 Кб
Скачать

Примеры:

  1. Демонстрация работы с классом 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();

}

}

}

  1. Пример использования свойства 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

Потокобезопасность:

Этот тип можно использовать в многопоточных операциях.