Язык программирования C#9 и платформа .NET5
Прежде чем погрузиться в детали пространства имен
, библиотеки TPL и ключевых словSystem.Threadingиasyncязыка С#, мы начнем с выяснения того, каким образом можно применять тип делегата .NET Core для вызова метода в асинхронной манере. Хотя вполне справедливо утверждать, что с выходом версии .NET 4.6 ключевые словаawaitиasyncпредлагают более простую альтернативу асинхронным делегатам, по-прежнему важно знать способы взаимодействия с кодом, использующим этот подход (в производственной среде имеется масса кода, в котором применяются асинхронные делегаты).awaitПространство имен System.Threading
В рамках платформ .NET и .NET Core пространство имен
предоставляет типы, которые дают возможность напрямую конструировать многопоточные приложения. В дополнение к типам, позволяющим взаимодействовать с потоком .NET Core Runtime, вSystem.Threadingопределены типы, которые открывают доступ к пулу потоков, обслуживаемому .NET Core Runtime, простому (не связанному с графическим пользовательским интерфейсом) классуSystem.Threadingи многочисленным типам, применяемым для синхронизированного доступа к разделяемым ресурсам.TimerВ табл. 15.1 перечислены некоторые важные члены пространства имен
. (За полными сведениями обращайтесь в документацию по .NET Core.)System.ThreadingКласс System.Threading.Thread
Класс
является самым элементарным из всех типов в пространстве именThread. Он представляет объектно-ориентированную оболочку вокруг заданного пути выполнения внутри отдельного домена приложения. В этом классе определено несколько методов (статических и уровня экземпляра), которые позволяют создавать новые потоки внутри текущего домена приложения, а также приостанавливать, останавливать и уничтожать указанный поток. Список основных статических членов приведен в табл. 15.2.System.ThreadingКласс
также поддерживает члены уровня экземпляра, часть которых описана в табл. 15.3.ThreadНа заметку! Прекращение работы или приостановка активного потока обычно считается плохой идеей. В таком случае есть шанс (хотя и небольшой), что поток может допустить "утечку" своей рабочей нагрузки.
Получение статистических данных о текущем потоке выполнения
Вспомните, что точка входа исполняемой сборки (т.е. операторы верхнего уровня или метод
) запускается в первичном потоке выполнения. Чтобы проиллюстрировать базовое применение типаMain(), предположим, что имеется новый проект консольного приложения по имениThread. Как вам известно, статическое свойствоThreadStatsизвлекает объектThread.CurrentThread, который представляет поток, выполняющийся в текущий момент. Получив текущий поток, можно вывести разнообразные статистические сведения о нем:Thread// Не забудьте импортировать пространство имен System.Threading.using System;using System.Threading;Console.WriteLine("***** Primary Thread stats *****\n");// Получить имя текущего потока.Thread primaryThread = Thread.CurrentThread;primaryThread.Name = "ThePrimaryThread";// Вывести статистические данные о текущем потоке.Console.WriteLine("ID of current thread: {0}",primaryThread.ManagedThreadId); // Идентификатор текущего потокаConsole.WriteLine("Thread Name: {0}",primaryThread.Name); // Имя потокаConsole.WriteLine("Has thread started?: {0}",primaryThread.IsAlive); // Запущен ли потокConsole.WriteLine("Priority Level: {0}",primaryThread.Priority); // Приоритет потокаConsole.WriteLine("Thread State: {0}",primaryThread.ThreadState); // Состояние потокаConsole.ReadLine();Вот как выглядит вывод:
***** Primary Thread stats *****ID of current thread: 1Thread Name: ThePrimaryThreadHas thread started?: TruePriority Level: NormalThread State: RunningСвойство Name
Обратите внимание, что класс
поддерживает свойство по имениThread. Если значениеNameне было установлено, тогда будет возвращаться пустая строка. Однако назначение конкретному объектуNameдружественного имени может значительно упростить отладку. Во время сеанса отладки в Visual Studio можно открыть окно Threads (Потоки), выбрав пункт меню Debug►Windows►Threads (Отладка► Окна►Потоки). На рис. 15.1 легко заметить, что окно Threads позволяет быстро идентифицировать поток, который нужно диагностировать.ThreadСвойство Priority
Далее обратите внимание, что в типе
определено свойство по имениThread. По умолчанию все потоки имеют уровень приоритетаPriority. Тем не менее, в любой момент жизненного цикла потока его можно изменить, используя свойствоNormalи связанное с ним перечислениеPriority:System.Threading.ThreadPrioritypublic enum ThreadPriority



