Межпроцессорное взаимодействие и многопоточность в .NET (реферат) (547923), страница 2
Текст из файла (страница 2)
class Test
{
static void Main()
{
//Создаем главный и фоновый потоки
BackgroundTest shortTest = new BackgroundTest(10);
Thread foregroundThread =
new Thread(new ThreadStart(shortTest.RunLoop));
foregroundThread.Name = "ForegroundThread";
BackgroundTest longTest = new BackgroundTest(50);
Thread backgroundThread =
new Thread(new ThreadStart(longTest.RunLoop));
backgroundThread.Name = "BackgroundThread";
backgroundThread.IsBackground = true;
//Запускаем потоки
foregroundThread.Start();
backgroundThread.Start();
}
}
class BackgroundTest
{
int maxIterations;
public BackgroundTest(int maxIterations)
{
this.maxIterations = maxIterations;
}
public void RunLoop()
{
String threadName = Thread.CurrentThread.Name;
for (int i = 0; i < maxIterations; i++)
{
//Вывод в консоль
Console.WriteLine("{0} count: {1}",
threadName, i.ToString());
Thread.Sleep(250);
}
Console.WriteLine("{0} finished counting.", threadName);
}
}
Выходная информация:
ForegroundThread count: 4
BackgroundThread count: 4
ForegroundThread count: 5
BackgroundThread count: 5
ForegroundThread count: 6
BackgroundThread count: 6
ForegroundThread count: 7
BackgroundThread count: 7
ForegroundThread count: 8
BackgroundThread count: 8
ForegroundThread count: 9
BackgroundThread count: 9
ForegroundThread finished counting
BackgroundThread count: 10
BackgroundThread count: 11
BackgroundThread count: 12
BackgroundThread count: 13
BackgroundThread count: 14
BackgroundThread count: 15
BackgroundThread count: 16
BackgroundThread count: 17
BackgroundThread count: 18
BackgroundThread count: 19
BackgroundThread finished countin
4) Ключевое слово lock
using System;
using System.Collections.Generic;
using System.Text;
namespace TestMutex
{
class ThreadSafe
{
//Разделяемое данное(может быть изменено в обоих потоках)
static bool done;
//Блокирующий объект
static object locker = new object();
static void Main()
{
new Thread(Go).Start();
Go();
}
static void Go()
{
//Критическая секция(доступна лищь одному потоку
//одновременно, для других потоков блоктруеться)
lock (locker)
{
if (!done)
{
Console.WriteLine("Done");
done = true;
}
}
}
}
}
Выходная информация: Done
Методы
| Name | Description |
| Abort | Вызывает исключение ThreadAbortException в вызвавшем его потоке для того, чтобы начать процесс завершения потока. Вызов этого метода обычно завершает поток. |
| GetDomain | Возвращает текущий домен, в котором выполняется текущий поток. |
| GetDomainID | Возвращает уникальный идентификатор домена приложения. |
| Interrupt | Прерывает работу потока, находящегося в состоянии WaitSleepJoin. |
| Join | Блокирует вызывающий поток до завершения потока. |
| ResetAbort | Отменяет метод Abort, запрошенный для текущего потока. |
| Resume | Возобновляет приостановленную работу потока. |
| Sleep | Блокирует текущий поток на заданное количество миллисекунд. |
| Start | Вынуждает операционную систему изменить состояние текущего экземпляра на ThreadState.Running. |
| Suspend | Приостанавливает работу потока; если работа потока уже приостановлена, не оказывает влияния. |
Определение:
[C#]
public void Abort();
public void Abort(object); (object – поток, который необходимо завершить)
public void Interrupt(); ( Если этот поток не является заблокированным в данный момент в состоянии ожидания, бездействия или присоединения, его работа будет прервана, когда он начнет блокироваться.)
public void Join();
public bool Join(int); ( Блокирует вызывающий поток до завершения потока или до момента истечения заданного времени. int - время)
public bool Join(TimeSpan); ( Блокирует вызывающий поток до завершения потока или до момента истечения заданного времени.TimeSpan - время)
public void Resume();
public void Start(); (Когда поток находится в состоянии Running, операционная система может распланировать его для выполнения. Когда поток начинает выполнение, конструктору поставляется делегат ThreadStart для потока, вызвавшего его методы. Если поток завершился, он не может быть запущен заново другим вызовом Start.)
public void Suspend(); (Если работа потока уже приостановлена, этот метод не даст никакого результата.)
Примеры:
-
Start(), Sleep()
using System;
using System.Threading;
public class ThreadWork
{
public static void DoWork()
{
//Три итерации вывода на консоль в дочернем потоке
for (int i = 0; i < 3; i++)
{
Console.WriteLine("Working thread...");
Thread.Sleep(100);
}
}
}
class ThreadTest
{
public static void Main()
{
//Создаем и запускаем поток
ThreadStart myThreadDelegate = new ThreadStart(ThreadWork.DoWork);
Thread myThread = new Thread(myThreadDelegate);
myThread.Start();
//Три итерации вывода на консоль в главном потоке
for (int i = 0; i < 3; i++)
{
Console.WriteLine("In main.");
Thread.Sleep(100);
}
}
}
Выходная информация:
In main
Working thread…
In main
Working thread…
In main
Working thread…
-
Resume()
using System;
using System.Threading;
class IsThreadPool
{
static void Main()
{
AutoResetEvent autoEvent = new AutoResetEvent(false);
//Запускаем дочерний поток
Thread regularThread =
new Thread(new ThreadStart(ThreadMethod));
regularThread.Start();
ThreadPool.QueueUserWorkItem(new WaitCallback(WorkMethod),
autoEvent);
//Ждем окончания главного потока
regularThread.Join();
//Ждем окончания фонового потока
autoEvent.WaitOne();
}
static void ThreadMethod()
{
Console.WriteLine("ThreadOne, executing ThreadMethod, " +
"is {0}from the thread pool.",
Thread.CurrentThread.IsThreadPoolThread ? "" : "not ");
}
static void WorkMethod(object stateInfo)
{
//Вывод на консоль
Console.WriteLine("ThreadTwo, executing WorkMethod, " +
"is {0}from the thread pool.",
Thread.CurrentThread.IsThreadPoolThread ? "" : "not ");
//Сигнализируем что поток завершил работу
((AutoResetEvent)stateInfo).Set();
}
}
Выходная информация:
ThreadOne, executing ThreadMethod, is not from the thread pool
ThreadTwo, executing WorkMethod, is from the thread pool
-
Interrupt(), Sleep(), SpinWait(), Join()
using System;
using System.Threading;
class ThreadInterrupt
{
static void Main()
{
StayAwake stayAwake = new StayAwake();
Thread newThread =
new Thread(new ThreadStart(stayAwake.ThreadMethod));
newThread.Start();
//Следующая строка сгенерит исключение в ThreadMethod
//если newThread блокирован или будет блокирован в будущем
newThread.Interrupt();
Console.WriteLine("Main thread calls Interrupt on newThread.");
//Говорим newThread спать
stayAwake.SleepSwitch = true;
//Ждем завершения newThread
newThread.Join();
}
}
class StayAwake
{
bool sleepSwitch = false;
public bool SleepSwitch
{
set { sleepSwitch = value; }
}
public StayAwake() { }
public void ThreadMethod()
{
Console.WriteLine("newThread is executing ThreadMethod.");
while (!sleepSwitch)
{
//Используем SpinWait для демонстрации эффекта
//вызова Interrupt в запущенном потоке
Thread.SpinWait(10000000);
}
try
{
Console.WriteLine("newThread going to sleep.");
//Когда newThread входит в слип, генерится исключение
// ThreadInterruptedException
Thread.Sleep(Timeout.Infinite);
}
catch (ThreadInterruptedException e)
{
Console.WriteLine("newThread cannot go to sleep - " +
"interrupted by main thread.");
}
}
}
Выходная информация:
Работа программы заканчивается исключением ThreadInterruptedException, когда поток выводиться из периода ожидания, так как производиться попытка вызвать поток метод sleep, после того как он был прерван методом interrupt.
Класс Process
Общая информация.
Описание:
Позволяет проанализировать процессы, выполняющиеся на данной машине (локальной или удаленной). Предлагает члены, которые позволяют запускать и останавливать процессы программными средствами, устанавливать уровни приоритета и получать список активных потоков или загруженных модулей, выполняемых в рамках данного процесса.
(Process как объект ядра подробно описан в [8])
Иерархия:
System.Object
System.MarshalByRefObject
System.ComponentModel.Component
System.Diagnostics.Process
Определение:
[C#]
public Process ()
Потокобезопасность:
Этот тип можно использовать в многопоточных операциях.
Process – составляющие
Свойства
| Name | Description |
| BasePriority | Приоритет процесса |
| ExitCode | Устанавливается по завершению процесса |
| ExitTime | Время завершения процесса |
| Handle | Возвращает дескриптор процесса |
| HandleCount | Число дескрипторов открытых процессом |
| Id | Уникальный id процесса |
| MachineName | Имя ЭВМ |
| MainModule | Главный модуль процесса |
| Modules | Набор модулей запущенных в рамках данного процесса |
| PriorityClass | Позволяет изменить базовый приоритет процесса |
| ProcessName | Имя процесса |
| StartTime | Время начала работы данного процесса |
| Threads | Коллекция потока данного процесса |
Методы
| Name | Description |
| GetCurrentProcess | Получить текущий процесс |
| GetProcesses | Получает набор процессов запущенных на текущей машине |
| GetProcessesByName | Получает набор процессов запущенных на соответствующей ЭВМ |
| Kill | Останавливает процесс |
| Start | Начать выполнение процесса |
Примеры:
-
Демонстрация работы с классом Process (печатаем текстовый файл в отдельном процессе)
using System;