异步顺序执行
在wpf中,操作数据库通常都是通过服务进行读取的,由于异步的特殊性,保存的时候如果分成几步进行处理的方法,此时就会有一定的麻烦。
MethodA.Completed->MethodB.Completed->MethodC
表示的是如果MethodA执行成功之后,结果正确在去执行MethodB,如果MethodB执行成功之后,结果正确则继续执行MethodC。
做法通常有两种:第一种是将MethodA,MethodB,MethodC移动到服务的一个方法中,这样所有的逻辑处理都在服务端进行,这是一种理想的状态。当然也有不理想的状态,就是调用了几个服务的情况,MethodA在Service1种,MethodB在Service2中,MethodC在Service3中,不管是设计的原因还是业务的原因,这种情况一旦出现,则将方法移动到统一的方法中就不在适用了,在这种情况下,如果设计结构就成了问题。
如:MethodA的职能是验证,MethodB的只能是处理某个结果,MethodC的职能是保存。
如果写成如下的代码:
MethodA() { MethodB(){ MethodC(){ } } } |
影响了职能单一,MethodA究竟是要执行验证,还是要执行保存?既然是验证,那么验证就可能在多处使用,那么该方法就是去了应有的作用。
在解决这类情况的一个理想状态时将MethodA,MethodB,MethodC分离开来,同时可以组合实现,即
MethodA MethodB MethodC |
那么他们的关系又该如何维护呢?什么时候MethodA
结束了该执行MethodB了,什么时候MethodB执行结束了在执行MethodC?
为了维护这种关系,我们应该做一个简单的门面,但是门面是有了,顺序还是通知不了啊?那我们就把方法给穿进去啊,MehtodA执行结束的时候,自动执行MethodB,这样既解开了MethodA和Method的耦合,同时实现了功能,可问题又来了,那如果MehtodA之后执行的是MehtodM呢?看来把MethodA传入还得改善一下,传入一个委托吧(Action,Func),当然Func在异步的时候就用不上了,方法执行什么时候返回结果还不知道,因此基本上都是没有返回值(void)的。
那么这样一改就成了:
MethodA(Action nextMethod) MethodB(Action nextMethod) MethodC |
再加上一个外观提供调用则
TestMethod(){ MehtodA(MehtodB(MethodC)); } |
OK ,问题解决掉,不知道还有没有更好的方法。