TGViewer
.NET Разработчик .NET Разработчик @netdeveloperdiary · 6.77K subscribers
Post #1137 1.6K
День девятьсот двадцать пятый. #ЧтоНовенького
.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/
  • 👍 2
More from @netdeveloperdiary
  1. Oct 16, 2026День 2816. #Карьера #AI Станет ли ИИ-Кодинг Концом Программирования для Людей? Автор ориги…
  2. Oct 15, 2026Post #3374
  3. Oct 14, 2026Post #3373
  4. Oct 13, 2026День 2813. #ЗаметкиНаПолях #Async Ещё Раз Про Async/Await в C#. Часть 1 Почему существует…
  5. Oct 12, 2026День 2812. #Карьера #AI Как Разработчикам Оставаться Полезными, Когда Код Пишет ИИ? По мер…
  6. Oct 11, 2026День 2811. #ВопросыНаСобеседовании Марк Прайс предложил свой набор из 60 вопросов (как тех…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →