WCF异步调用中客户端关闭带来的性能问题

WCF异步调用优化
本文探讨了WCF异步调用中的性能瓶颈,并通过对比两种不同的异步调用方式,展示了如何从100~300毫秒优化到0~5毫秒。发现耗时主要在于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客户端在另外一个线程中慢慢关闭。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值