Чем функция async-await в C # 5.0 отличается от TPL?

Я не вижу разницы между новыми асинхронными функциями C # (и VB) и .NET 4.0 Библиотека параллельных задач Возьмем, к примеру, код Эрика Липперта отсюда :

async void ArchiveDocuments(List<Url> urls) {
    Task archive = null;
    for(int i = 0; i < urls.Count; ++i) {
        var document = await FetchAsync(urls[i]);
        if (archive != null)
            await archive;
        archive = ArchiveAsync(document);
    }
}

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

Разве это не так просто?

void ArchiveDocuments(List<Url> urls) {
    for(int i = 0; i < urls.Count; ++i) {
        var document = FetchAsync(urls[i]);       // removed await
        if (archive != null)
            archive.Wait();                       // changed to .Wait()
        archive = ArchiveAsync(document.Result);  // added .Result
    }
}

Я заменил первое await на Task.Result , где значение действительно необходимо, и второй await с Task.Wait () , где ожидание действительно происходит. Функциональность (1) уже реализована, а (2) семантически намного ближе к тому, что на самом деле происходит в коде.

Я понимаю, что метод async переписан как конечный автомат, аналогичный итераторам, но я также не вижу, какие преимущества это приносит. Любой код, для работы которого требуется другой поток (например, загрузка), по-прежнему будет требовать другого потока, а любой код, который этого не делает (например, чтение из файла), все равно может использовать TPL для работы только с одним потоком.

Мне здесь явно не хватает чего-то огромного; Кто-нибудь может помочь мне понять это немного лучше?

61
задан Cœur 9 August 2017 в 04:07
поделиться