Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Как было сказано, все процессы имеют, по крайней мере, один поток управления, который обычно называется стартовым или основным.↑ Стр 1 из 4Следующая ⇒ Содержание книги
Поиск на нашем сайте
Многопоточность
Как было сказано, все процессы имеют, по крайней мере, один поток управления, который обычно называется стартовым или основным. Поток может находиться в одном из нескольких возможных состояний: · Он может выполняться. · Он может быть готовым к выполнению. Выполняющийся поток может быть приостановлен, т.е. его выполнение временно прекращается. Позже оно может быть возобновлено. · Поток может быть заблокирован в ожидании необходимого ресурса. · Наконец, поток может завершиться, и уж в этом случае его выполнение окончено и продолжению (возобновлению) не подлежит. В среде.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. Список перегрузки 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);
Исключения
Примечания Делегат, заданный параметром 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 - члены Открытые конструкторы
Открытые свойства
Открытые методы
Защищенные методы
- статический ThreadState - перечисление Задает состояния выполнения объекта Thread. Атрибут FlagsAttribute этого перечисления разрешает двоичные операции со значениями его членов. [Flags][Serializable] public enum ThreadStateПримечания Класс ThreadState определяет набор всех возможных состояний выполнения для потока. После создания потока и до завершения он находится по крайней мере в одном из состояний. Потоки, созданные в общеязыковой среде выполнения, изначально находятся в состоянии Unstarted, в то время как внешние потоки, приходящие в среду выполнения, находятся уже в состоянии Running. Потоки с состоянием Unstarted переходят в состояние Running при вызове метода Start. Не все комбинации значений ThreadState являются допустимыми; например, поток не может быть одновременно в состояниях Aborted и Unstarted. В следующей таблице перечислены действия, вызывающие смену состояния.
В дополнение к вышеперечисленным состояниям, существует также 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. Члены
Требования Пространство имен: System.Threading Сборка: Mscorlib (в Mscorlib.dll) См. также System.Threading - пространство имен | Thread | Состояния потоков | Управляемые и неуправляемые потоки Многопоточность
Как было сказано, все процессы имеют, по крайней мере, один поток управления, который обычно называется стартовым или основным. Поток может находиться в одном из нескольких возможных состояний: · Он может выполняться. · Он может быть готовым к выполнению. Выполняющийся поток может быть приостановлен, т.е. его выполнение временно прекращается. Позже оно может быть возобновлено. · Поток может быть заблокирован в ожидании необходимого ресурса. · Наконец, поток может завершиться, и уж в этом случае его выполнение окончено и продолжению (возобновлению) не подлежит. В среде.NET Framework определено два типа потоков: высокоприоритетный (foreground) и низкоприоритетный, или фоновый (background). По умолчанию поток создается высокоприоритетным, но его тип можно изменить, т.е. сделать его фоновым. Единственное различие между высоко- и низкоприоритетным потоками состоит в том, что последний будет автоматически завершен, если все высокоприоритетные потоки в его процессе остановились. Поточно-ориентированная многозадачность не может обойтись без специального средства, именуемого синхронизацией, которое позволяет координировать выполнение потоков вполне определенными способами. В С# предусмотрена отдельная подсистема, посвященная синхронизации. Создание потока
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2016-09-05; просмотров: 224; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.147.78.249 (0.016 с.) |