В последнее время я столкнулся с довольно многими ситуациями, когда async методы выполняются синхронно, но в любом случае возвращают задачу, поэтому их можно ожидать, например
public virtual Task CreateAsync(TUser user)
{
    ThrowIfDisposed();
    if (user == null) throw new ArgumentNullException("user");
    Context.Save(user);
    Context.Flush();
    return Task.FromResult(0);
}
 Разумеется, лучше отправить вероятную долговременную операцию в поток и вернуть все еще активную задачу, чтобы ее можно было ожидать:
public virtual Task CreateAsync(TUser user)
{
    ThrowIfDisposed();
    if (user == null) throw new ArgumentNullException("user");
    return Task.Run(() =>
    {
        Context.Save(user);
        Context.Flush();
    });
}
 Однако я подозреваю, что просто отключение потоков TPL - это не самая безопасная практика. Любой комментарий к этим двум различным шаблонам?