WCF非同步呼叫中客戶端關閉帶來的效能問題

2021-06-19 18:29:40 字數 855 閱讀 2067



這裡的wcf非同步呼叫是指單向非可靠非同步呼叫,也就是你不知道呼叫是否成功,適用於效能高於可靠性的場合。

之前發布過一篇隨筆wcf非同步呼叫實戰:oneway+asynchronous operation,通過wcf服務端「單向(one-way)訊息交換」+wcf客戶端「非同步通道呼叫(asynchronous operation)」實現快速的wcf非同步呼叫。

但是,使用了一段時間,發現還是有些慢。今天實測了一下,呼叫**如下:

var client = new externalservice.feedwcf.feedserviceclient();

client.createasync(...);

try

catch

實測下來,上面的呼叫耗時100~300毫秒左右。慢!

當時有點想不明白,都已經非同步了,怎麼還會慢?

於是改為更直接的非同步呼叫 —— task.factory.startnew(),**如下:

task.factory.startnew(() =>

catch

});

實測下來,呼叫耗時0~5毫秒,這才是非同步的效果。

wcf客戶端的非同步怎麼了?檢視wcf客戶端**類的**,非同步呼叫部分也沒問題。

後來,恍然大悟,原來問題不在非同步呼叫(client.createasync),而是在wcf客戶端的關閉(client.close)。

於是,專門針對client.close()進行測試,發現時間全耗在這裡(100~300毫秒)!

目前還沒找到「如何在非同步呼叫時關閉wcf client」的解決方法,先用task.factory.startnew()湊合著,讓wcf客戶端在另外乙個執行緒中慢慢關閉。

客戶端動態呼叫WCF服務中的方法

客戶端呼叫wcf 有時需要動態的呼叫服務端的wcf中的方法,本方法,反射wcf 的介面,動態呼叫介面中的方法。主要為,動態繫結,反射動態呼叫。public static object executemethod string purl,string pmethodname,params object...

WCF 客戶端呼叫不使用Using

wcf的客戶端不能在using中使用。try finally 而dispose方法內部呼叫的是close方法。close方法不是強制關閉。從而導致dispose方法可以在finally語句塊中被不安全呼叫。丟擲不可預知的異常,即便捕獲異常,仍有可能一直保持著鏈結。try中執行服務呼叫,呼叫完成使用c...

WCF實現雙工通訊及客戶端呼叫

新建乙個windows窗體應用程式 即客戶端client 和乙個wcf服務庫 wcf雙工 在wcf雙工專案下 新建一歌ilogger介面和實現該介面的logger類 在ilogger介面中 using system using system.collections.generic using sys...