Ниже приведен результат выполнения этой программы.
У основного потока нет имени.
Приоритет: Normal
Установка имени и приоритета.
Теперь основной поток называется: Основной Поток
Теперь приоритет: AboveNormal
Следует, однако, быть очень внимательным, выполняя операции с основным потоком. Так, если добавить в конце метода Main()
следующий вызов метода Join()
:
Thrd.Join();
программа никогда не завершится, поскольку она будет ожидать окончания основного потока!
Дополнительные средства многопоточной обработки, внедренные в версии .NET Framework 4.0
В версии .NET Framework 4.0 внедрен ряд новых средств многопоточной обработки, которые могут оказаться весьма полезными. Самым важным среди них является новая система отмены. В этой системе поддерживается механизм отмены потока простым, вполне определенным и структурированным способом. В основу этого механизма положено понятие CancellationTokenSource
и в структуре CancellationToken
. Система отмены полностью интегрирована в новую библиотеку распараллеливания задач (TPL), и поэтому она подробнее рассматривается вместе с TPL в главе 24.
В класс System.Threading
добавлена структура SpinWait
, предоставляющая методы SpinOnce()
и SpinUntil()
, которые обеспечивают более полный контроль над ожиданием в состоянии занятости. Вообще говоря, структура SpinWait
оказывается непригодной для однопроцессорных систем. А для многопроцессорных систем она применяется в цикле. Еще одним элементом, связанным с ожиданием в состоянии занятости, является структура SpinLock
, которая применяется в цикле ожидания до тех пор, пока не станет доступной блокировка. В класс Thread
добавлен метод Yield()
, который просто выдает остаток кванта времени, выделенного потоку. Ниже приведена общая форма объявления этого метода.
public static bool Yield()
Этот метод возвращает логическое значение true
, если происходит переключение контекста. В отсутствие другого потока, готового для выполнения, переключение контекста не произойдет.
Рекомендации по многопоточному программированию
Для эффективного многопоточного программирования самое главное — мыслить категориями параллельного, а не последовательного выполнения кода. Так, если в одной программе имеются две подсистемы, которые могут работать параллельно, их следует организовать в отдельные потоки. Но делать это следует очень внимательно и аккуратно, поскольку если создать слишком много потоков, то тем самым можно значительно снизить,.а не повысить производительность программы. Следует также иметь в виду дополнительные издержки, связанные с переключением контекста. Так, если создать слишком много потоков, то на смену контекста уйдет больше времени ЦП, чем на выполнение самой программы! И наконец, для написания нового кода, предназначенного для многопоточной обработки, рекомендуется пользоваться библиотекой распараллеливания задач (TPL), о которой речь пойдет в следующей главе.
Запуск отдельной задачи
Многозадачность на основе потоков чаще всего организуется при программировании на С#. Но там, где это уместно, можно организовать и многозадачность на основе процессов. В этом случае вместо запуска другого потока в одной и той же программе одна программа начинает выполнение другой. При программировании на C# это делается с помощью класса Process
, определенного в пространстве имен System.Diagnostics
. В заключение этой главы вкратце будут рассмотрены особенности запуска и управления другим процессом.
Простейший способ запустить другой процесс — воспользоваться методом Start()
, определенным в классе Process. Ниже приведена одна из самых простых форм этого метода:
public static Process Start(string имя_файла)
где
Когда созданный процесс завершается, следует вызвать метод Close()
, чтобы освободить память, выделенную для этого процесса. Ниже приведена форма объявления метода Close()
.
public void Close()
Процесс может быть прерван двумя способами. Если процесс является приложением Windows с графическим пользовательским интерфейсом, то для прерывания такого процесса вызывается метод CloseMainWindow()
, форма которого приведена ниже.
public bool CloseMainWindow()