NET异步调用Webserver

时间:2023-06-16 15:04:20

之前,有个同事跑来问我一堆的什么多线程异步进行调用Sap的服务再突然把进程关闭,还说要设置一个循环判断调用的结果,搞得我听的一头雾水,但是我明显感觉到他的设计思路已经渐行渐远了...已经再偏远的山区中没有车回来了!无奈 作为了公司新人,我理清了他的需求,就是因为不懂异步调用webserver ,或者说调用了不懂怎么回调函数的事件构造,或者说sap实在太懒,无法给与任何返回,也没法给与返回。反正不懂 NET开发 和SAP开发 那边有问题,反正 是真的有问题了!

就这样的前提下,三四个人来找我...问我之前做的什么异步调用SAP服务的,其实我偏爱同步啊,哈哈·  ~   而且网上信息都是一些比较笼统的说,不讲究思维和官网的事件剖析。不利于我这种小生学习掌握~~

然后告诉了他的思路设计错误,  我本人是很讨厌那种需要别人源码发给对方的人,不过也算了,凡是自己的思维设计上方向是错的,有一点是可以让旁人很清楚的:那就是这个人描述起来是十分复杂,混乱的一个代码处理逻辑,也会有很多莫名其妙的东西出现。

前后经历过几个团队的成长,我曾经鼓励自己要了解团队中大家的思维,这样彼此能够更好的互补 做好这个团队, 但是这人也不是我的部门的,尽力帮忙了~

示例调用委托事件分别有:

  onBeginHelloWorldDelegate、onEndHelloWorldDelegate、onHelloWorldCompletedDelegate:开始, 结束,提交后。

Net底层调用委托:

  ClientBase<TChannel>.BeginOperationDelegate   ;ClientBase<TChannel>.EndOperationDelegate  ;SendOrPostCallback :被调度到同步上下文时要调用的方法

  

所以异步如果你想要处理 回调与批量调用间的关系,很简单,可以用HelloWorldAsync重载函数 (string arg, object userState)   userState 将会从InvokeAsync带到,TestWebService.HelloWorldCompletedEventArgs e:

调用代码:   testwebservice.HelloWorldAsync(para.name, para);  ----para为调用要给的回调标识实体。

所以,这样通过这些委托事件的绑定,重载  是可以做到任何个回调或执行开始 结束的 业务处理,也可以自己在该服务命名空间拓展更多复杂的委托 事件回调;

案例分析:

  Net异步调用服务并委托回调收集;第一,要调用的服务不进行任何返回结果;第二,我们要把握好任何执行结果,不排除对方服务关闭;第三, 一定要异步、多线程(存在技术盲,一听异步多线程就觉得好)。

  方案一: 从代理类进行构造委托进行回调,在async函数中进行委托事件的回调。从头到脚自立一套委托事件的声明,爱啥参数就啥参数 爱怎么瞎搞都行。 在system.threading中定义一个委托SendOrPostCallbackTwo及在System中定义一个EventhandlerTwo委托,

NET异步调用Webserver

在服务代理生成类中进行事件声明 event_A,及进行构造声明 OnHelloWorldCompletedTwo(object state,object entity)函数,

NET异步调用Webserver

在异步调用函数HelloworldAsync中 附加事件判断或实现,

NET异步调用Webserver

在HelloWorldCompletedEventArgsTwo中进行构造函数:

NET异步调用Webserver

代理类调用方式:

NET异步调用Webserver

回调函数ProcessCompleteThree:

NET异步调用Webserver

预备的线程池委托类的声明:

NET异步调用Webserver

线程池调用:

NET异步调用Webserver

其实这个方案就是运用委托事件去实现,但是有的人一看到web服务引入生成的那个代理对象里面乱乱的就好好研究他的机制,一般不会采用如此麻烦的回调构造。

方案2是利用线程池委托类的构造函数进行,参数带入,这样在回调的时候就知道什么主键进行业务处理了。

NET异步调用Webserver

还有方案3是利用上图中的e.UserState ,   这个是在服务生成对象中的Completed中就会自动生成的, 原理与方案1一样 。

NET异步调用Webserver

不多加说明了。

仅作学习之用,转载请注明出处 。