Synchronicznie czeka na operację asynchroniczną i dlaczego Wait () zamraża program tutaj

Przedmowa: Szukam wyjaśnienia, a nie tylko rozwiązania. Znam już rozwiązanie.

Pomimo spędzenia kilku dni na studiowaniu artykułów MSDN o asynchronicznym wzorcu asynchronicznym (TAP) opartym na zadaniach, oczekuję na nie, wciąż jestem trochę zdezorientowany niektórymi szczegółami.

Piszę program rejestrujący dla aplikacji Windows Store i chcę wspierać rejestrowanie asynchroniczne i synchroniczne. Metody asynchroniczne są zgodne z TAP, te synchroniczne powinny to wszystko ukryć, i wyglądać i działać jak zwykłe metody.

Jest to podstawowa metoda rejestrowania asynchronicznego:

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);
}

Teraz odpowiednia metoda synchroniczna ...

Wersja 1:

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

Wygląda to poprawnie, ale nie działa. Cały program zamarza na zawsze.

Wersja 2:

Hmm .. Może zadanie nie zostało rozpoczęte?

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

To rzucaInvalidOperationException: Start may not be called on a promise-style task.

Wersja 3:

Hmm ..Task.RunSynchronously brzmi obiecująco.

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

To rzucaInvalidOperationException: RunSynchronously may not be called on a task not bound to a delegate, such as the task returned from an asynchronous method.

Wersja 4 (rozwiązanie):

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

To działa. Tak więc 2 i 3 są niewłaściwymi narzędziami. Ale 1? Co jest nie tak z 1 i jaka jest różnica do 4? Co powoduje, że 1 powoduje zamrożenie? Czy jest jakiś problem z obiektem zadania? Czy istnieje nieoczywisty impas?

questionAnswers(4)

yourAnswerToTheQuestion