.NET 6: Улучшения Потоковой Обработки. Окончание
Начало
2. Thread.ManagedThreadId устарел
Свойство
Environment.CurrentManagedThreadId было введено в .NET 4.5 как более эффективная альтернатива свойству Thread.ManagedThreadId. Однако об этом никогда не сообщалось в документации, и разработчики продолжают использовать Thread.ManagedThreadId.Чтобы направить разработчиков к лучшему варианту, для
Thread.ManagedThreadId было добавлено предупреждение для анализатора кода.Хотя это фактически означает, что
Thread.ManagedThreadId устарел, он не помечается как устаревший. Разработчики могут продолжать использовать его в обозримом будущем, даже при том, что Environment.CurrentManagedThreadId теперь является предпочтительным.3. Thread.UnsafeStart
Новая функция для запуска потоков называется «небезопасной», потому что она не захватывает контекст выполнения.
UnsafeStart был добавлен, потому что нужно было лениво создавать потоки пула потоков и поток таймера в контексте выполнения по умолчанию. UnsafeStart избегает захвата текущего контекста выполнения и его восстановления при запуске потока. Есть и другие места, где создаются потоки, которые могут использовать аналогичную логику.Эта функция уже используется:
- в
FileSystemWatcher для OS X,- в
SocketAsyncEngine для Unix,- в
CounterGroup в Tracing API,- в
ThreadPoolTaskScheduler, когда задача помечена как LongRunning.При запуске в браузере
UnsafeStart выбросит PlatformNotSupportedException.4. Класс PeriodicTimer
Класс
PeriodicTimer предназначен для использования в асинхронном контексте. Как вы можете видеть ниже, необходимо использовать await между каждым тиком таймера:var second = TimeSpan.FromSeconds(1);Основные свойства класса
using var timer = new PeriodicTimer(second);
while (await timer.WaitForNextTickAsync())
Console.WriteLine($"Tick {DateTime.Now}");
PeriodicTimer:- Этот API имеет смысл только для таймеров, которые срабатывают многократно. Таймеры, которые срабатывают один раз, могут быть основаны на задачах (у нас уже есть
Task.Delay для этого).- Таймер будет приостановлен во время выполнения кода пользователя и вернёт следующий тик после его завершения.
- Таймер можно остановить с помощью
CancellationToken.- Контекст выполнения не захватывается.
Таймер также можно остановить, вызвав
Stop или Dispose, даже если в настоящее время выполняется вызов WaitForNextTickAsync.В .NET уже есть пять других таймеров, но ни один из них не имеет этого конкретного набора функций. В документацию планируется добавить новое руководство по выбору правильного таймера.
Интересный факт: класс
PeriodicTimer будет первым таймером, который разделит пространство имен с другим таймером. Ранее каждый таймер помещался в отдельное пространство имен:-
System.Timers.Timer
- System.Threading.Timer
- System.Windows.Forms.Timer
- System.Web.UI.Timer
- System.Windows.Threading.DispatcherTimer
Источник: https://www.infoq.com/news/2021/08/net6-Threading/