Разница между передачей обычной и асинхронной анонимной функции в Task.Run для асинхронной работы - PullRequest
0 голосов
/ 15 марта 2019

В чем разница между

ResultType result = await Task.Run(() => GetResultAsync())

и

ResultType result = await Task.Run(async() => await GetResultAsync())

Я бы предположил, что первый выстрелит и забудет GetResultAsync(), так как это не ожидается, но тогда какэто дает результат?Я удивлен, что тип возвращаемого значения Task.Run равен Task<ResultType>, а не Task<Task<ResultType>>.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Оба делают то же самое с точки зрения результата.В обоих случаях используется перегрузка Task.Run<TResult>(Func<Task<TResult>> function), которая разворачивает задачу изнутри - поэтому результат равен Task<ResultType>.Разница между ними эквивалентна разнице между

    static Task<T> Compute()
    {
        return GetAsyncResult();
    }

и

    static async Task<T> Compute()
    {
        return await GetAsyncResult();
    }

В первом случае обещание просто передается вызывающей стороне, а во втором - конечный автоматпостроен компилятором вокруг метода Compute.

0 голосов
/ 15 марта 2019

В первой строке «Task.Run», которую вы запускаете, сразу же возвращается результат «GetResultAsync». Этот результат, тем не менее, является Задачей, которую можно ожидать (от вашего 'await'). Итак, вы на самом деле «ждете» метод GetResultAsync.

Во второй строке вы запускаете задачу, которая не возвращается сразу, а ждет, пока не завершится GetResultAsync (вызывается асинхронно). Повторный тип вашей Задачи - ResultType. Таким образом, вы «ожидаете» свою собственную задачу, которая, в свою очередь, вернется только после ожидания метода «GetResultAsync».

В конце концов, они оба достигают одного и того же результата, но немного по-разному.

...