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

3) Создание потоков в фоновом режиме. Использование свойства IsBackground.

Приоритетные потоки (foreground) обеспечивают текущему приложению защиту от преждевременного завершения. Среда CLR не прекратит работу приложения (не выгрузит соответствующий домен приложения), пока не завершат работу все приоритетные потоки.

Фоновые потоки (background) рассматриваются средой CLR, как возобновляемые ветви выполнения, которыми можно пренебречь в любой момент времени (даже при выполнении ими своих задач). Поэтому, когда все приоритетные потоки завершаются, все фоновые потоки будут завершены автоматически в результате выгрузки домена приложения (больше информации можно получить в [4])

using System;

using System.Threading;

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(); (Если работа потока уже приостановлена, этот метод не даст никакого результата.)

Примеры:

  1. 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…

  1. 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