WCF異步調用中客戶端關閉帶來的性能問題


這里的WCF異步調用是指單向非可靠異步調用,也就是你不知道調用是否成功,適用於性能高於可靠性的場合。

之前發布過一篇隨筆WCF異步調用實戰:OneWay+Asynchronous Operation,通過WCF服務端“單向(One-way)消息交換”+WCF客戶端“異步信道調用(Asynchronous Operation)”實現快速的WCF異步調用。

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

var client = new ExternalService.FeedWcf.FeedServiceClient();
client.CreateAsync(...);
try { client.Close(); }
catch { client.Abort(); }

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

當時有點想不明白,都已經異步了,怎么還會慢?

於是改為更直接的異步調用 —— Task.Factory.StartNew(),代碼如下:

Task.Factory.StartNew(() =>
{
var client = new ExternalService.FeedWcf.FeedServiceClient();
client.CreateAsync(...);
try { client.Close(); }
catch { client.Abort(); }
});

實測下來,調用耗時0~5毫秒,這才是異步的效果。

WCF客戶端的異步怎么了?查看WCF客戶端代理類的代碼,異步調用部分也沒問題。

...

后來,恍然大悟,原來問題不在異步調用(client.CreateAsync),而是在WCF客戶端的關閉(client.Close)。

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

目前還沒找到“如何在異步調用時關閉WCF Client”的解決方法,先用Task.Factory.StartNew()湊合着,讓WCF客戶端在另外一個線程中慢慢關閉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM