В дополнение Ответ Марка - имейте в виду, что async
является подробностью реализации метода.Как или почему метод создает Task
, который он возвращает вам, в значительной степени прозрачен (и поэтому async
не является частью сигнатуры, не допускается в определениях интерфейса и т. Д.)
Хотя этоЭто правда, что ваш метод разделяет свой «текущий контекст» с методами, которые он вызывает, только в том случае, если эти методы, если они хотят знать текущий контекст, будут вызывать SynchronizationContext.Current
.Затем они будут использовать методы на этого контекста, чтобы при необходимости вернуться к нему.Любые «изменения» в контексте обычно будут выполняться путем переключения продолжений на подходящий поток, для которого уже установлен правильный контекст .
Что эти методы не будут обычно звоните SetSynchronizationContext
.Только если метод вызывает это, вам нужно беспокоиться об изменениях в «вашем» контексте.(Некоторые инфраструктурные коды могут вызывать этот метод, если их контекст синхронизации является свободным потоком, но требует других окружающих ресурсов. Они получат поток пула потоков, вызовят SetSynchronizationContext
, выполнят продолжение и затем снова сбросят контекст синхронизации).