Вызов синхронного кода из асинхронного

Бывает возникает потребность асинхронно использовать синхронный метод.
Вот какой приём нам может в этом помочь, если требуется возвращать из метода значение:

1
2
3
4
5
async Task<bool> EnvelopeMethodAsync()
{
bool result = MethodSync();
return await Task.FromResult(result);
}

Если же метод должен возвращать Task и внутри вызывать void, тогда:

1
2
3
4
5
async Task EnvelopeMethodAsync()
{
MethodSync();
await Task.CompletedTask;
}

Если просто вызывать синхронные методы внутри асинхронных и по счастливой случайности нам не встретится ни один await оператор какого-нибудь другого асинхронного метода, то компилятор будет выдавать предупреждение о нехватке await оператора. Потенциально это может нести ошибки, т.к. его можно просто забыть указать в async методе. Если это так, то метод без await и его вызывающий код продолжат одновременное выполнение и метод который не эвэйтят (await) может преждевременно прекратить работу с окончанием работы вызывающего его кода. Также проблема async метода который не эвейтят может произойти в случае возникновения исключения в нём, которое не будет отловлено вызывающим кодом.

Может показаться, зачем столько заморочек только чтобы не ругался компилятор. На самом деле код становится чище явно выражая свои намерения и разработчику, которому предстоит поддерживать его в будущем. Не надо сомневаться насчёт забытого случайно или не поставленного преднамеренно await.