Добрый день! Постигаю 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 понимает, что нельзя/не нужно/можно/(а нужно ли вообще в консоли?) менять поток. И как на это влияет контекст синхронизации