Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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

Поиск

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

 

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

Поток может находиться в одном из нескольких возможных состояний:

· Он может выполняться.

· Он может быть готовым к выполнению. Выполняющийся поток может быть приостановлен, т.е. его выполнение временно прекращается. Позже оно может быть возобновлено.

· Поток может быть заблокирован в ожидании необходимого ресурса.

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

В среде.NET Framework определено два типа потоков: высокоприоритетный (foreground) и низкоприоритетный, или фоновый (background). По умолчанию поток создается высокоприоритетным, но его тип можно изменить, т.е. сделать его фоновым.

Единственное различие между высоко- и низко­приоритетным потоками состоит в том, что последний будет автоматически завершен, если все высокоприоритетные потоки в его процессе остановились.

Поточно-ориентированная многозадачность не может обойтись без специального средства, именуемого синхронизацией, которое позволяет координировать выполнение потоков вполне определенными способами. В С# предусмотрена отдельная подсистема, посвященная синхронизации.

Создание потока

В классе Thread пространства имен System.Threading определен ряд методов и свойств для управления потоками.

Чтобы создать поток, необходимо создать объект типа Thread. В классе Thread определен следующий конструктор:

public Thread (ThreadStart entryPoint)

Здесь:

Параметр еntryPoint содержит имя метода, который будет вызван, чтобы начать выполнение потока (команд).

Тип ThreadStart — это делегат, определенный в среде.NET Framework:

Public delegate void ThreadStart ()

Метод, представляющий поток, должен иметь тип возвращаемого значения void и не принимать никаких аргументов.

Пример:

Thread t2 = new Thread (new ThreadStart (Method));

Для запуска потока на выполнение необходимо вызвать метод Start(), который определяется в классе Thread:

Public void Start()

После выхода из entryPolnt-метода выполнение потока автоматически завершается.

 

Пример.

t2.Start();

Метод Sleep() приостановливает выполнение потока, из которого он был вызван, на период времени, заданный в миллисекундах.

Public static void Sleep (int milliseconds)

Пример 1. Создание нового потока на базе статического метода

using System;

using System.Threading;

 

class Class1

{

// Дочерний поток. Метод Coundown считает от 1 до 1000

public static void Method ()

{

for (int i = 1; i <= 10000; i++)

Console.Write (i + " ");

}

 

 

// Стартовый поток

static void Main ()

{

// Создание второго потока

// ThreadStart dlg = new ThreadStart(Method));

// Thread t2 = new Thread (dlg);

 

Thread t2 = new Thread (new ThreadStart (Method));

 

// Запуск потока

t2.Start();

 

// В это же время метод Method вызывается в основном потоке

Method ();

 

Console.ReadLine();

}

}

 

 

Пример 2. Создание нового потока на базе динамического метода

 

using System;

using System.Threading;

 

class Class1

{

public int count;

private string thrdName;

 

public Class1(string name)

{

count = 0;

thrdName = name;

}

 

// Начало (входная точка) потока.

public void Run ()

{

Console.WriteLine (thrdName + " стартовал.");

 

do

{

Console.Write ("#");

 

Thread. Sleep (300);

 

} while (++count < 10);

 

Console.WriteLine ("\n" + thrdName + " завершен.");

}

}

 

class MultiThread

{

public static void Main ()

{

Console.WriteLine ("Основной поток стартовал.");

 

// Сначала создаем объект класса Class1.

Class1 mt = new Class1 ("Дочерний поток");

 

// Затем из метода этого объекта создаем поток.

Thread newThrd = new Thread (new ThreadStart(mt.Run));

 

 

newThrd.Start(); // Запускаем выполнение потока.

 

do

{

Console.Write(".");

 

Thread. Sleep (200);

} while (mt.count!= 10);

 

Console.WriteLine ("Основной поток завершен.");

}

}

 

 

В VS 2005 возможен вызов параметризированного конструктора Thread без делегата. Благодаря такой возможности можно запускать поток, передавая ему параметр в методе Start():

using System;

using System.Threading;

 

Public class Work

{

Public static void Main()

{

// To start a thread using a shared thread procedure, use the class name and

// method name when you create the ParameterizedThreadStart delegate.

 

// C# infers the appropriate delegate creation syntax:

// new ParameterizedThreadStart(Work.DoWork)

 

Thread newThread = new Thread(Work.DoWork);

// Thread newThread = new Thread(new ParameterizedThreadStart(Work.DoWork));

// Use the overload of the Start method that has a parameter of type Object.

// You can create an object that contains several pieces of data, or you can pass

// any reference type or value type.

// The following code passes the integer value 42.

 

newThread.Start(42);

 

// To start a thread using an instance method for the thread

// procedure, use the instance variable and method name when

// you create the ParameterizedThreadStart delegate.

// C# infers the appropriate delegate creation syntax:

// new ParameterizedThreadStart(w.DoMoreWork)

 

Work w = new Work();

newThread = new Thread(w.DoMoreWork);

 

// Pass an object containing data for the thread.

 

newThread.Start ("The answer.");

}

 

 

public static void DoWork (object data)

{

Console.WriteLine("Static thread procedure. Data='{0}'", data);

}

 

 

public void DoMoreWork (object data)

{

Console.WriteLine("Instance thread procedure. Data='{0}'", data);

}

}

 

 

/* This code example produces the following output (the order

of the lines might vary):

 

Static thread procedure. Data='42'

Instance thread procedure. Data='The answer'

*/

 

 

Если метод Start содержит параметр, то и вызываемый метод должен быть определен с параметром типа object.

 

Создание нескольких потоков в конструкторе класса и синхронизация их завершения.

 

В классе Thread определено свойство Name, которое хранит имя потока:

public string Name { get; set; }

 

 

Первый способ синхронизации завершения.

 

В классе Thread свойство IsAlive возвращает значение true, если поток, для которого оно опрашивается, еще выполняется. В противном случае оно возвращает значение false.

 

// Используем свойство IsAlive для установления факта

// завершения выполнения нескольких потоков

 

using System;

using System.Threading;

 

class Class1

{

public int count; // количество циклов ожидания

public Thread thrd;

private char id; // идентификатор потока

 

public Class1(string name, char idt)

{

count = 0;

id = idt;

 

thrd = new Thread (new ThreadStart (this.Run));

thrd.Name = name; // имя потока

thrd.Start();

}

// Входная точка потока.

Void Run()

{

Console.WriteLine(thrd.Name + " стартовал.");

do

{

Console.Write (id);

Thread.Sleep(300);

}

while (++count < 10);

Console.WriteLine("\n" + thrd.Name + " завершен.");

}

}

 

class MoreThreads

{

public static void Main()

{

Console.WriteLine("Основной поток стартовал.");

 

// Создаем три потока.

Class1 mt1 = new Class1("Дочерний поток 1", '#');

Class1 mt2 = new Class1("Дочерний поток 2", '*');

Class1 mt3 = new Class1("Дочерний поток 3", '-');

 

do

{

Console.Write(".");

Thread.Sleep(200);

} while (mt1.thrd.IsAlive && mt2.thrd.IsAlive && mt3.thrd.IsAlive);

 

Console.WriteLine("\n Основной поток завершен.");

}

}

 

 

Второй способ состоит в вызове метода Join(), который переводит поток, в котором он был вызван, в состояние ожидания завершения объектного потока.

 

 

class MoreThreads

{

public static void Main()

{

Console.WriteLine("Основной поток стартовал.");

 

// Создаем три потока.

MyThread mt1 = new MyThread("Дочерний поток 1", '#');

MyThread mt2 = new MyThread("Дочерний поток 2", '*');

MyThread mt3 = new MyThread("Дочерний поток 3", '-');

 

mt1.thrd. Join ();

Console.WriteLine("\nДочерний поток 1 присоединен.");

 

mt2.thrd. Join ();

Console.WriteLine("Дочерний поток 2 присоединен.");

 

mt3.thrd. Join ();

Console.WriteLine("Дочерний поток 3 присоединен.");

 

Console.WriteLine("\nОсновной поток завершен.");

}

}

 

 

Свойство IsBackground

Среда.NET Framework определяет два типа потоков: высокоприоритетные и фоновые.

Приоритеты потоков

После старта дочерний поток получает стандартное значение приоритета. Его можно изменить с помощью свойства Priority, которое является членом класса Thread.

Общий формат его использования таков:

public ThreadPriority Priority { get; set; }

Здесь ThreadPriority — перечисление, которое определяет следующие пять значений приоритета:

ThreadPriority.Highest

ThreadPriority.AboveNormal

ThreadPriority.Normal

ThreadPriority.BelowNormal

ThreadPriority.Lowest

По умолчанию потоку присваивается значение приори­тета ThreadPriority.Normal.

Рассмотрим на примере, какой поток быстрее увеличит в цикле переменную count до 1 000 000 000.

// Демонстрация использования приоритетов потоков.

 

using System;

using System.Threading;

 

class Class1

{

public int count;

public Thread thrd;

 

static bool stop = false;

static string currentName;

 

// Создаем новый поток.

//Этот конструктор не запускает потоки на выполнение. */

 

public Class1(string name)

{

count = 0;

thrd = new Thread(new ThreadStart(this.Run));

thrd.Name = name;

currentName = name;

}

 

void Run()

{

Console.WriteLine("Поток " + thrd.Name + " стартовал");

do

{

count++;

 

if (currentName!= thrd.Name)

{

currentName = thrd.Name;

Console.WriteLine ("Выполняется поток " + currentName);

}

 

} while (stop == false && count < 1000000000);

stop = true;

 

Console.WriteLine("Поток " + thrd.Name + " завершен");

}

}

class PriorityDemo

{

public static void Main()

{

Class1 mt1 = new Class1("с высоким приоритетом");

Class1 mt2 = new Class1("с низким приоритетом");

 

// Устанавливаем приоритеты.

mt1.thrd.Priority = ThreadPriority.AboveNormal;

mt2.thrd.Priority = ThreadPriority.BelowNormal;

 

// Запускаем потоки на выполнение.

mt1.thrd.Start();

mt2.thrd.Start();

 

mt1.thrd.Join();

mt2.thrd.Join();

 

Console.WriteLine();

Console.WriteLine("Поток " + mt1.thrd.Name + " досчитал до " + mt1.count);

Console.WriteLine("Поток " + mt2.thrd.Name + " досчитал до " + mt2.count);

}

}

 

Выполнения потоков

 

Поток может отменить запрос на завершение выполнения. Для этого поток должен перехватить исключение типа ThreadAbortException, а затем вызвать метод ResetAbort(). Это защищает исключение от автоматической регенерации по окончании его обработки потоком.

Timer – члены класса

Открытые конструкторы

Timer - конструктор Перегружен. Инициализирует новый экземпляр класса Timer.

Открытые методы

Change Перегружен. Меняет время запуска и интервал межу вызовами метода таймера.
CreateObjRef (унаследовано от MarshalByRefObject) Создает объект, который содержит всю необходимую информацию для создания прокси-сервера, используемого для коммуникации с удаленными объектами.
Dispose Перегружен. Освобождает все ресурсы, используемые экземпляром класса Timer.
Equals (унаследовано от Object) Перегружен. Определяет, равны ли два экземпляра Object.
GetHashCode (унаследовано от Object)   Служит хеш-функцией для конкретного типа, пригоден для использования в алгоритмах хеширования и структурах данных, например в хеш-таблице.
GetLifetimeService (унаследовано от MarshalByRefObject) Извлекает служебный объект текущего срока действия, который управляет средствами срока действия данного экземпляра.
GetType (унаследовано от Object) Возвращает Type текущего экземпляра.
InitializeLifetimeService (унаследовано от MarshalByRefObject) Получает служебный объект срока действия, для управления средствами срока действия данного экземпляра.
ToString (унаследовано от Object) Возвращает String, который представляет текущий Object.

Защищенные методы

Finalize   Переопределен. Освобождает ресурсы, удерживаемые текущим экземпляром. В языках C# и C++ для функций финализации используется синтаксис деструктора.
MemberwiseClone (унаследовано от Object) Создает неполную копию текущего Object.

 

 

Timer - конструктор

Инициализирует новый экземпляр класса Timer.

Список перегрузки

1. Инициализирует новый экземпляр класса Timer, используя указанное 32-разрядное знаковое целое число для задания временного интервала.

 

public Timer(TimerCallback, object, int, int);

 

2. Инициализирует новый экземпляр класса Timer, используя указанное 64-разрядное знаковое целое число для измерения временных интервалов.

 

public Timer(TimerCallback, object, long, long);

 

3. Инициализирует новый экземпляр класса Timer, используя значения объекта TimeSpan для измерения временных интервалов.

 

public Timer(TimerCallback, object, TimeSpan, TimeSpan);

 

4. Инициализирует новый экземпляр класса Timer, используя указанное 32-разрядное беззнаковое целое число для измерения временных интервалов. Этот конструктор не соответствует спецификации CLS.

 

public Timer(TimerCallback, object, uint, uint);

 

 

Исключения

Тип исключения Условие
ArgumentOutOfRangeException Значение параметра dueTime или period отрицательно, и не равно Infinite.
ArgumentNullException Параметр callback имеет значение пустая ссылка

Примечания

Делегат, заданный параметром callback, вызывается один раз, после того, как пройдет время, равное dueTime, и затем каждый раз по прошествии времени, равного значению period.

 

Если параметр dueTime равен нулю (0), сразу используется параметр callback. Если параметр dueTime равен Timeout.Infinite, параметр callback не используется; счетчик отключается, но он может быть включен заново вызовом метода Change.

Если параметр period равен нулю (0) или Infinite, а параметр dueTime не равен Infinite, параметр callback используется один раз; периодическое поведение таймера отключается, но может быть включено заново используя метод Change.

 

 

Пример

 

 

using System;

using System.Threading;

Class ManagementThreads

{

// Метод CheckTime вызывается по таймеру

Static void Main()

{

// Создание делегата, который будет вызываться таймером

TimerCallback tc = new TimerCallback (CheckTime);

// Создание таймера, срабатывающего дважды в секунду (500)

// Первый запуск произойдет через одну секунду (1000)

Timer t = new Timer (tc, null, 1000, 500);

// Ожидание ввода пользователя

Console.WriteLine ("Нажмите Enter для выхода");

Console.ReadLine();

t.Dispose(); // Освобождение ресурсов

t = null;

}

}

Thread - класс

Создает и контролирует поток, задает его приоритет и возвращает его статус.

public sealed class Thread

Примечания

Процесс может создавать один или более потоков для выполнения частей программного кода, связанного с процессом. Следует использовать делегат ThreadStart для задания программного кода, выполняемого потоком.

В течение своего существования поток всегда находится в одном или более состояниях, определенных в классе ThreadState. Для потока можно запрашивать планирование уровня приоритета, который определяется классом ThreadPriority, но не гарантируется, что операционная система предоставит его.

Метод GetHashCode предоставляет идентификацию управляемых потоков. В течение жизни поток не будет конфликтовать со значениями, полученными от других потоков, независимо от домена приложения, из которой получается значение.

Примечание. Идентификационный номер потока (ThreadId) операционной системы не имеет жесткой взаимосвязи с управляемым потоком, так как неуправляемый хост может контролировать взаимосвязь между управляемыми и неуправляемыми потоками. В частности, сложный хост может использовать API общеязыковой среды выполнения для планирования нескольких управляемых потоков на один поток операционной системы или перемещения управляемых потоков между различными потоками операционной системы.

Пример

using System;using System.Threading; // Simple threading scenario: Start a static method running// on a second thread. public class ThreadExample { // The ThreadProc method is called when the thread starts. // It loops ten times, writing to the console and yielding // the rest of its time slice each time, and then ends. public static void ThreadProc () { for (int i = 0; i < 10; i++) { Console.WriteLine("ThreadProc: {0}", i); // Yield the rest of the time slice. Thread.Sleep(0); } } public static void Main () { Console.WriteLine("Main thread: Start a second thread."); // The constructor for the Thread class requires a ThreadStart // delegate that represents the method to be executed on the // thread. C# simplifies the creation of this delegate. Thread t = new Thread(new ThreadStart(ThreadProc)); // Start ThreadProc. On a uniprocessor, the thread does not get // any processor time until the main thread yields. Uncomment // the Thread.Sleep that follows t.Start() to see the difference. t.Start(); //Thread.Sleep(0); for (int i = 0; i < 4; i++) { Console.WriteLine("Main thread: Do some work."); Thread.Sleep(0); } Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends."); t.Join(); Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program."); Console.ReadLine(); }}

Этот код формирует выходные данные, подобные приведенным ниже:

Main thread: Start a second thread.Main thread: Do some work.ThreadProc: 0Main thread: Do some work.ThreadProc: 1Main thread: Do some work.ThreadProc: 2Main thread: Do some work.ThreadProc: 3Main thread: Call Join(), to wait until ThreadProc ends.ThreadProc: 4ThreadProc: 5ThreadProc: 6ThreadProc: 7ThreadProc: 8ThreadProc: 9Main thread: ThreadProc.Join has returned. Press Enter to end program.

Пространство имен: System.Threading

Thread - члены

Открытые конструкторы

Thread - конструктор Инициализирует новый экземпляр класса Thread.

Открытые свойства

ApartmentState Возвращает или задает состояние апартамента для данного потока.
CurrentContext Возвращает текущий контекст, в котором выполняется поток.
CurrentCulture Возвращает или задает культуру для текущего потока.
CurrentPrincipal Возвращает или задает текущий принципал потока (для безопасности на основе ролей).
CurrentThread   Возвращает выполняющийся в данный момент поток.
CurrentUICulture Возвращает или задает текущую культуру, используемую диспетчером ресурсов для поиска ресурсов, связанных с культурой, во время выполнения.
IsAlive Возвращает значение, показывающее статус выполнения текущего потока.
IsBackground Возвращает или задает значение, показывающее, является ли поток фоновым.
IsThreadPoolThread Возвращает значение, показывающее, принадлежит ли поток к группе управляемых потоков.
Name Возвращает или задает имя потока.
Priority   Возвращает или задает значение, указывающее на планируемый приоритет потока.
ThreadState Возвращает значение, содержащее состояния текущего потока.

Открытые методы

Abort Перегружен. Вызывает исключение ThreadAbortException в вызвавшем его потоке для того, чтобы начать процесс завершения потока. Вызов этого метода обычно завершает поток.
AllocateDataSlot Выделяет неименованную область данных всем потокам.
AllocateNamedDataSlot Выделяет именованную область данных всем потокам.
Equals (унаследовано от Object) Перегружен. Определяет, равны ли два экземпляра Object.
FreeNamedDataSlot Удаляет связь между названием и областью для всех потоков в процессе.
GetData Извлекает значение из заданной области текущего потока, внутри текущей области текущего потока.
GetDomain Возвращает текущую область, в которой выполняется текущий поток.
GetDomainID Возвращает уникальный идентификатор домена приложения.
GetHashCode (унаследовано от Object) Служит хеш-функцией для конкретного типа, пригоден для использования в алгоритмах хеширования и структурах данных, например в хеш-таблице.
GetNamedDataSlot Ищет именованную область данных.
GetType (унаследовано от Object) Возвращает Type текущего экземпляра.
Interrupt Прерывает работу потока, находящегося в состоянии WaitSleepJoin.
Join Перегружен. Блокирует вызывающий поток до завершения потока.
MemoryBarrier Синхронизирует память. Как результат сбрасывает содержимое кэш-памяти в основную память для процессора, выполняющего текущий поток.
ResetAbort Отменяет метод Abort, запрошенный для текущего потока.
Resume Возобновляет приостановленную работу потока.
SetData Задает данные в указанной области для текущей области потока, выполняющегося в данный момент.
Sleep Перегружен. Блокирует текущий поток на заданное количество миллисекунд.
SpinWait Вынуждает поток ожидать количество времени, определенное параметром iterations.
Start Вынуждает операционную систему изменить состояние текущего экземпляра на ThreadState.Running.
Suspend Приостанавливает работу потока; если работа потока уже приостановлена, не оказывает влияния.
ToString (унаследовано от Object) Возвращает String, который представляет текущий Object.
VolatileRead Перегружен. Считывает значение поля. Это значение является последним, записанным каким-либо из процессоров компьютера, независимо от количества процессоров и от состояния кэш-буфера процессоров.
VolatileWrite Перегружен. Записывает значение непосредственно в поле, так что оно становится видимым для всех процессоров компьютера.

Защищенные методы

Finalize   Переопределен. Освобождает ресурсы, удерживаемые экземпляром. В языках C# и C++ для функций финализации используется синтаксис деструктора.
MemberwiseClone (унаследовано от Object) Создает неполную копию текущего Object.

- статический

ThreadState - перечисление

Задает состояния выполнения объекта Thread.

Атрибут FlagsAttribute этого перечисления разрешает двоичные операции со значениями его членов.

[Flags][Serializable] public enum ThreadState

Примечания

Класс ThreadState определяет набор всех возможных состояний выполнения для потока. После создания потока и до завершения он находится по крайней мере в одном из состояний. Потоки, созданные в общеязыковой среде выполнения, изначально находятся в состоянии Unstarted, в то время как внешние потоки, приходящие в среду выполнения, находятся уже в состоянии Running. Потоки с состоянием Unstarted переходят в состояние Running при вызове метода Start. Не все комбинации значений ThreadState являются допустимыми; например, поток не может быть одновременно в состояниях Aborted и Unstarted.

В следующей таблице перечислены действия, вызывающие смену состояния.

Действие Состояние Потока
Поток создается в среде CLR. Unstarted
Поток вызывает метод Start. Running
Поток начинает выполнение. Running
Поток вызывает метод Sleep. WaitSleepJoin
Поток вызывает метод Wait для другого объекта. WaitSleepJoin
Поток вызывает метод Join для другого потока. WaitSleepJoin
Другой поток вызывает метод Interrupt. Running
Другой поток вызывает метод Suspend. SuspendRequested
Поток отвечает на запрос метода Suspend. Suspended
Другой поток вызывает метод Resume. Running
Другой поток вызывает метод Abort. AbortRequested
Поток отвечает на запрос метода Abort. Stopped
Поток завершен. Stopped

В дополнение к вышеперечисленным состояниям, существует также Background состояние, которое указывает, выполняется ли поток на фоне или на переднем плане.

Поток может находиться в более, чем одном состоянии одновременно. Например, если поток заблокирован при вызове к методу Wait, а другой поток вызывает метод Abort к заблокированному потоку, то этот заблокированный поток будет находится одновременно в состояниях WaitSleepJoin и AbortRequested. В этом случае, как только поток осуществляет возврат из вызова к методу Wait или его работа прерывается, он получит исключение ThreadAbortException для начала аварийного завершения.

Свойство Thread.ThreadState потока содержит текущее состояние потока. Приложения должны использовать битовую маску для того, чтобы определить, выполняется поток или нет. Если значение для состояния Running потока равно нулю (0), следует проверить, выполняется ли поток, используя код C#, например, (myThread.ThreadState & (ThreadState.Stopped | ThreadState.Unstarted)) == 0, или код Visual Basic, например, (myThread.ThreadState And (ThreadState.Stopped Or ThreadState.Unstarted)) = 0.

Члены

Имя члена Описание Значение
Aborted Поток находится в Stopped состоянии.  
AbortRequested Метод Thread.Abort был вызван для потока, но поток еще не получил задерживающийся объект System.Threading.ThreadAbortException, который будет пытаться завершить поток.  
Background Поток выполняется как фоновый поток, что является противоположным к приоритетному потоку. Это состояние контролируется заданием свойства Thread.IsBackground.  
Running Поток был запущен, он не заблокирован, и нет задерживающегося объекта ThreadAbortException.  
Stopped Процесс остановлен.  
StopRequested Поток запрашивается на остановку. Это только для внутреннего использования.  
Suspended Работа потока была приостановлена.  
SuspendRequested Запрашивается приостановка работы потока.  
Unstarted Метод Thread.Start не был вызван для потока.  
WaitSleepJoin Поток заблокирован в результате вызова к методам Wait, Sleep или Join.  

Требования

Пространство имен: System.Threading

Сборка: Mscorlib (в Mscorlib.dll)

См. также

System.Threading - пространство имен | Thread | Состояния потоков | Управляемые и неуправляемые потоки

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

 

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

Поток может находиться в одном из нескольких возможных состояний:

· Он может выполняться.

· Он может быть готовым к выполнению. Выполняющийся поток может быть приостановлен, т.е. его выполнение временно прекращается. Позже оно может быть возобновлено.

· Поток может быть заблокирован в ожидании необходимого ресурса.

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

В среде.NET Framework определено два типа потоков: высокоприоритетный (foreground) и низкоприоритетный, или фоновый (background). По умолчанию поток создается высокоприоритетным, но его тип можно изменить, т.е. сделать его фоновым.

Единственное различие между высоко- и низко­приоритетным потоками состоит в том, что последний будет автоматически завершен, если все высокоприоритетные потоки в его процессе остановились.

Поточно-ориентированная многозадачность не может обойтись без специального средства, именуемого синхронизацией, которое позволяет координировать выполнение потоков вполне определенными способами. В С# предусмотрена отдельная подсистема, посвященная синхронизации.

Создание потока



Поделиться:


Последнее изменение этой страницы: 2016-09-05; просмотров: 224; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.147.78.249 (0.016 с.)