Почему эта асинхронная функция ожидает возвращаемого значения - PullRequest
0 голосов
/ 28 октября 2019

У меня есть функция следующим образом:

public static async Task<bool> DoSomething()
{
    await Task.Run(() =>
    {
        //do something that takes a long time
        bool success = ALongFunction();
        return success;
    });
}

Приведенный выше код не компилируется, так как ожидает возврата значения после ожидания. Почему это? Код в задаче возвращает значение во всех путях выполнения, и я подумал, что возвращение этого после await должно обрабатываться механизмом await. Что я должен вернуть в вышеупомянутом? Должен ли я сделать что-то вроде этого:

public static async Task<bool> WriteMonitor(string filename, IMonitorAsync monitorAsync)
{
    bool success = false;
    await Task.Run(() =>
    {
        //do something that takes a long time
        success = ALongFunction();
    });
    return success;
}

Выше компилируется, но я ожидал, что верхний код также скомпилируется.

Ответы [ 2 ]

3 голосов
/ 28 октября 2019

Вы возвращаете значение bool, в то время как ваш метод фактически возвращает Task<bool>.

Измените метод для возврата ожидаемого Task.

return await Task.Run(...);
0 голосов
/ 28 октября 2019

В текущей форме функция возвращает только задачу (не Task<bool>).

public static async Task<bool> DoSomething()
{
    await Task.Run(() =>
    {
        return AFunctionThatTakesALongTime();
    });
}

эквивалентен следующему фрагменту:

public static async Task<bool> DoSomething()
{
    bool r = await Task.Run(() =>
    {
        return AFunctionThatTakesALongTime();
    });
    // not returning r
}

Solution

return await Task.Run(() => ...)
...