Задать вопрос
@mkd_2128506
C# full-stack developer (middle)

C# Почему в ConsoleApp после await меняется поток, а в WinForms нет?

Добрый день! Постигаю async / await.
Собственно, пример кода

Console.WriteLine(SynchronizationContext.Current != null ? SynchronizationContext.Current.ToString() : "null");
 Console.WriteLine($"Main ThreadCode before await: {Environment.CurrentManagedThreadId}");
 await Task.Delay(2000);
 Console.WriteLine($"Main ThreadCode after await: {Environment.CurrentManagedThreadId}");
 Console.WriteLine(SynchronizationContext.Current != null ? SynchronizationContext.Current.ToString() : "null");


Если запускать в ConsoleApplication(Net 8.0), то ThreadCode меняется. Контекст синхронизации по нулям.
Если запускать в обработчике события(button_click), то ThreadCode тот же самый. Конткест синхронизации не null.

Я знаю, что объекты интерфейса можно менять в единственном GUI-потоке. Но пока ещё не могу всё во едино связать.
Можно чуть чуть подробнее объяснить, каков механизм. Как CLR понимает, что нельзя/не нужно/можно/(а нужно ли вообще в консоли?) менять поток. И как на это влияет контекст синхронизации
  • Вопрос задан
  • 35 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@SZolotov
Asp.net core, MAUI,WPF,Qt, Avalonia
Почитайте про дефолтное поведение ConfigureAwait в консольных и gui приложениях
Ответ написан
Комментировать
Потому что в винформах свой synchronization context, а в консоли - стандартный.
Почему в ConsoleApp после await меняется поток

Вообще-то смена потока не гарантируется ;)

Я знаю, что объекты интерфейса можно менять в единственном GUI-потоке.

Вот ради этого контекст синхронизации и существует.

CLR не нужно ничего понимать - ему заранее сообщается, что нужно использовать контекст синхронизации.
Где именно это в недрах винформ происходит - не подскажу (надеюсь, меня дополнят)

Если этого не сделать - используется стандартное поведение при котором разрешено менять потоки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы