为什么这个async / await代码生成" ...并非所有代码路径都返回一个值"?

时间:2012-08-24 18:59:06

标签: c# asynchronous task-parallel-library async-await c#-5.0

希望这不是重复,但这里有5000多个问题,“并非所有代码路径都返回值”!

很简单,为什么这个非泛型实现的方法编译得很好:

    public static async Task TimeoutAfter(this Task task, int millisecondsTimeout)
    {
        if (task == await Task.WhenAny(task, Task.Delay(millisecondsTimeout)))
            await task;
        else
            throw new TimeoutException();
    }

虽然这种尝试使方法通用会产生Return state missing / ... not all code paths return a value警告/错误?:

    public static async Task<T> TimeoutAfter<T>(this Task<T> task, int millisecondsTimeout)
    {
        if (task == await Task.WhenAny(task, Task.Delay(millisecondsTimeout)))
            await task;
        else
            throw new TimeoutException();
    }

2 个答案:

答案 0 :(得分:10)

非泛型Task类型有点等同于等待的void方法。就像void方法一样,不能从返回类型为Task的方法返回任何内容,这就是第一个示例编译的原因。但是,第二个示例需要泛型类型的返回值,并且您没有在等待另一个调用的路径中提供一个。

引用async关键字上的MSDN reference,特别是关于返回类型。

  

如果方法没有返回有意义的值,则使用Task   完成。也就是说,对方法的调用返回一个Task,但是当时   任务完成,任何等待表达式等待任务   评估为无效。

答案 1 :(得分:7)

在第二个例子中,你给了你没有返回任何东西。 (参见Chris Hannon对其原因的回答)。

public static async Task<T> TimeoutAfter<T>(this Task<T> task, int millisecondsTimeout) {
    if (task == await Task.WhenAny(task, Task.Delay(millisecondsTimeout)))
        return await task; // return the Task of T
    else
        throw new TimeoutException();
}

除了@ChrisHannon所说的await documentation

  

...如果await应用于返回Task<TResult>的方法调用的结果,则await表达式的类型为TResult。如果await应用于返回Task的方法调用的结果,则await表达式的类型为void。 ...