之前,有個同事跑來問我一堆的什么多線程異步進行調用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委托,

在服務代理生成類中進行事件聲明 event_A,及進行構造聲明 OnHelloWorldCompletedTwo(object state,object entity)函數,

在異步調用函數HelloworldAsync中 附加事件判斷或實現,

在HelloWorldCompletedEventArgsTwo中進行構造函數:

代理類調用方式:

回調函數PRocessCompleteThree:

預備的線程池委托類的聲明:

線程池調用:

其實這個方案就是運用委托事件去實現,但是有的人一看到web服務引入生成的那個代理對象里面亂亂的就好好研究他的機制,一般不會采用如此麻煩的回調構造。
方案2是利用線程池委托類的構造函數進行,參數帶入,這樣在回調的時候就知道什么主鍵進行業務處理了。

還有方案3是利用上圖中的e.UserState , 這個是在服務生成對象中的Completed中就會自動生成的, 原理與方案1一樣 。

不多加說明了。
僅作學習之用,轉載請注明出處 。
新聞熱點
疑難解答