26.5.5 任务内部揭秘
在每个Task对象中,都包含代表Task唯一ID的一个Int32字段。创建一个Task对象时,字段初始化为零。第一次查询Task的只读Id属性时,属性将一个唯一Int32值分配给该字段,并从属性中返回它。TaskID从1开始,每分配一个ID都递增1。这个ID的意义在于,每个Task都可以用一个唯一的值来标识。运行一个任务的代码时,可以查询Task的静态CurrentId属性,它返回一个可空Int32(Int32?)。如果当前没有任务正在执行,查询CurrentId属性会返回null。
一个Task对象存在期间,可查询Task的只读Status属性了解它在其生存期的什么位置。这个属性返回一个TaskStatus值。TaskStatus值:Created、WaitingForActivation、WaitingToRun、Running、WaitingForChildrenToComplete、RanToCompletion、Canceled、Faulted。
一个Task或者Task<TResult>出错时,可以查询Task的Exception属性来获得任务抛出的未处理的异常。该属性总是返回一个AggregateException对象,它的包含了所有未处理的异常。
为简化编码,Task提供了几个只读的Boolean属性:IsCanceled、IsFaulted和IsCompleted。
如果Task是通过以下某个函数来创建的,这个Task对象就会处于WaitForActivation状态:ContinueWith、ContinueWhenAll、ContinueWhenAny或者FromAsync。
不能显式启动一个通过调用ContinueWith来创建的对象,这个Task会在它的先驱任务(antecedent task)执行完毕后自动开始。
26.5.6 任务工厂