這里的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客戶端在另外一個線程中慢慢關閉。