Esperando sincronamente por uma operação assíncrona, e por que o Wait () congela o programa aqui?

Prefácio: Estou procurando uma explicação, não apenas uma solução. Eu já conheço a solução.

Apesar de ter passado vários dias estudando artigos do MSDN sobre o Padrão Assíncrono Baseado em Tarefas (TAP), assíncrono e aguardo, ainda estou um pouco confuso sobre alguns dos detalhes mais sutis.

Estou escrevendo um criador de logs para o Windows Store Apps e quero oferecer suporte a log assíncrono e síncrono. Os métodos assíncronos seguem o TAP, os síncronos devem esconder tudo isso, e parecem e funcionam como métodos comuns.

Esse é o método principal do log assíncrono:

private async Task WriteToLogAsync(string text)
{
    StorageFolder folder = ApplicationData.Current.LocalFolder;
    StorageFile file = await folder.CreateFileAsync("log.log",
        CreationCollisionOption.OpenIfExists);
    await FileIO.AppendTextAsync(file, text,
        Windows.Storage.Streams.UnicodeEncoding.Utf8);
}

Agora o método síncrono correspondente ...

Versão 1:

private void WriteToLog(string text)
{
    Task task = WriteToLogAsync(text);
    task.Wait();
}

Isso parece correto, mas não funciona. Todo o programa congela para sempre.

Versão 2:

Hmm .. Talvez a tarefa não tenha sido iniciada?

private void WriteToLog(string text)
{
    Task task = WriteToLogAsync(text);
    task.Start();
    task.Wait();
}

Isso lançaInvalidOperationException: Start may not be called on a promise-style task.

Versão 3:

Hmm..Task.RunSynchronously Parece promissor.

private void WriteToLog(string text)
{
    Task task = WriteToLogAsync(text);
    task.RunSynchronously();
}

Isso lançaInvalidOperationException: RunSynchronously may not be called on a task not bound to a delegate, such as the task returned from an asynchronous method.

Versão 4 (a solução):

private void WriteToLog(string text)
{
    var task = Task.Run(async () => { await WriteToLogAsync(text); });
    task.Wait();
}

Isso funciona. Então, 2 e 3 são as ferramentas erradas. Mas 1? O que há de errado com 1 e qual a diferença para 4? O que faz com que 1 cause um congelamento? Existe algum problema com o objeto de tarefa? Existe um impasse não óbvio?

questionAnswers(4)

yourAnswerToTheQuestion