2012-08-13 121 views
0

如果使用async声明的异步方法具有返回类型的任务或任务<TResult>它可以等待。在该方法内部,在C#代码中不返回任务,但是在任务TResult >的情况下TResult的值。例如:任务表示由返回任务的异步方法返回的任务是什么?

private static async Task<int> AsyncDemo() 
{ 
    await Task.Delay(1000); 
    return 1; 
} 

生成的IL代码返回启动编译状态机的AsyncTaskMethodBuilder的任务。我的问题是这个任务实际代表什么。我认为这是一个代表不是线程的任务,而是状态机的执行。我还假设在状态机完成时完成任务,或者在发生异常时将任务设置为Faulted状态。我赞赏澄清。

回答

1

该任务在概念上表示该方法。

当方法返回时,任务完成(成功),并将结果集设置为方法返回的值(如果适用)。如果该方法抛出异常,则该任务出现故障(由错误完成)。 OperationCanceledException有一个特例:在这种情况下,任务被取消(完成并取消)。

从技术上讲,任务确实表示状态机,它是对方法的重写。但是由于状态机是隐藏的,任务在概念上代表了方法本身。

+0

谢谢斯蒂芬,那就是我的想法 – 2012-08-13 16:29:42