AsyncManager的核心是通过属性OutstandingOperations表示的正在进行的异步操作计数器,该属性是一个类型为OperationCounter的对象。操作计数通过只读属性Count表示,当我们开始和完成异步操作的时候分别调用Increment和Decrement方法作增加和介绍计数操作。Increment和Decrement各自具有两个重载,作为整数参数value(该参数值可以是负数)表示增加或者减少的数值,如果调用无参方法,增加或者减少的数值为1。如果我们需要同时执行多个异步操作,则可以通过如下的方法来操作计数器。
AsyncManager.OutstandingOperations.Increment(3);
Task.Factory.StartNew(() =>
{
//异步操作1
AsyncManager.OutstandingOperations.Decrement();
});
Task.Factory.StartNew(() =>
{
//异步操作2
AsyncManager.OutstandingOperations.Decrement();
});
Task.Factory.StartNew(() =>
{
//异步操作3
AsyncManager.OutstandingOperations.Decrement();
});
对于每次通过Increment和Decrement方法调用引起的计数数值的改变,OperationCounter对象都会检验当前计数数值是否为零,如果则表明所有的操作运行完毕,如果预先注册了Completed事件,该事件会被触发。值得一提的时候,表明所有操作完成执行的标志是计数器的值等于零,而不是小于零,如果我们通过调用Increment和Decrement方法使计数器的值称为一个负数,注册的Completed事件是不会被触发的。
AsyncManager在初始化的时候就注册了通过属性OutstandingOperations表示的OperationCounter对象的Completed事件,使该事件触发的时候调用自身的Finish方法。而虚方法Finish在AsyncManager中的默认实现又会触发自身的Finished事件。
如下面的代码片断所示,Controller类实现了IAsyncManagerContainer接口,而后者定义了一个只读属性AsyncManager用于提供辅助执行异步Action的AsyncManager对象,而我们在定义异步Action方法是使用的AsyncManager对象就是从抽象类Controller中集成下来的AsyncManager属性。
public abstract class Controller ControllerBase, IAsyncManagerContainer,...
{
public AsyncManager AsyncManager { get; }
}
public interface IAsyncManagerContainer
{
AsyncManager AsyncManager { get; }
}
四、Completed方法的执行
对于通过XxxAsync/XxxCompleted形式定义的异步Action,我们说回调操作XxxCompleted会在定义在XxxAsync方法中的异步操作执行结束之后被自动调用,那么XxxCompleted方法具体是如何被执行的呢?
异步Action的执行最终是通过描述该Action的AsyncActionDescriptor对象的BeginExecute/EndExecute方法来完成的。通过之前“Model的绑定”的介绍我们知道通过XxxAsync/XxxCompleted形式定义的异步Action通过一个ReflectedAsyncActionDescriptor对象来表示的,ReflectedAsyncActionDescriptor在执行BeginExecute方法的时候会注册Controller对象的AsyncManager的Finished事件,使该事件触发的时候去执行Completed方法。








