JIT-компиляцией (just-in-time), при котором каждая отдельная функция компилируется при первом запуске.
Если вы пишете библиотеки, то в большинстве случаев следует вызывать ConfigureAwait(false) везде, где используется await. Это связано с тем, что продолжение через контекст синхронизации может быть затратным, а в некоторых случаях способно привести к взаимоблокировке. Единственным исключением являются случаи, когда вы делаете что-то, что определенно требует сохранения контекста синхронизации, или же вы точно знаете, что ваша библиотека всегда будет использоваться только в средах приложений, которые не устанавливают контекст синхронизации. (Например, приложения ASP.NET Core не используют контексты синхронизации, поэтому обычно не имеет значения, вызываете ли вы в них ConfigureAwait(false).)
Простейшая реализация шаблона await
public class MyAwaitableType
{
public MinimalAwaiter GetAwaiter()
{
return new MinimalAwaiter();
}
public class MinimalAwaiter : INotifyCompletion
{
public bool IsCompleted => true;
public string GetResult() => "This is a result";
public void OnCompleted(Action continuation)
{
throw new NotImplementedException();
}
}
}