When you await
, by default the await
operator will capture the current “context” and use that to resume the async
method.
This “context” is SynchronizationContext.Current
unless it is null
, in which case it is TaskScheduler.Current
. (If there is no currently-running task, then TaskScheduler.Current
is the same as TaskScheduler.Default
, the thread pool task scheduler).
It’s important to note that a SynchronizationContext
or TaskScheduler
does not necessarily imply a particular thread. A UI SynchronizationContext
will schedule work to the UI thread; but the ASP.NET SynchronizationContext
will not schedule work to a particular thread.
I suspect that the cause of your problem is that you are invoking the async
code too early. When an application starts, it just has a plain old regular thread. That thread only becomes the UI thread when it does something like Application.Run
.