c#WCF问题速度快

时间:2013-07-04 09:07:28

标签: c# wcf

我必须在两台计算机之间进行许多序列化通信,我现在正在使用WCF,但是完成一个操作所花费的时间是10k到20k,这对我的通信来说太多了,我也试过了直接TCP / IP序列化这个结果要多得多,每次操作大约1k-2k滴答。我真的很喜欢坚持WCF,因为它很简单,我也注意到WCF不能同时处理多个操作,这也是需要的东西。有没有办法做到这一点,可能与其他东西然后WCF?还是我坚持编写自己的TCP / IP序列化通信?

这就是我的请求:

pipeFactory = new ChannelFactory<IBlissRequest>(binding, new EndpointAddress(ep));
pipeProxy = tempPipeFactory.CreateChannel();
((IClientChannel)pipeProxy).Open();
Stopwatch sw = new Stopwatch();
sw.Restart();
string returnString = pipeProxy.SystemRequest("name", "somthing more", "some data");
sw.Stop();
Console.WriteLine(sw.ElapsedTicks);

这是使用的接口:

[ServiceContract]
public interface IBlissRequest
{
    [OperationContract]
    string SystemRequest(string InstanceName, string MethodName, string Parameters);
}

在接口中执行的方法为空,因此几乎不消耗滴答

2 个答案:

答案 0 :(得分:2)

WCF服务和使用WCF客户端(直接使用ClientBase或ChannelFactory)的一些生产性能问题是由于.NET垃圾收集器由于草率的对象处理而被迫执行大量工作。我将使用性能监视器在运行时检查.NET垃圾收集器的行为,看看是否会导致峰值。

如果是GC问题,那么您需要检查您的服务和客户端代码。在服务上,确保对象实例范围尽可能受限。这有助于确保实例主要是在Gen0中进行垃圾收集,这种情况最常发生。还应审查客户端代码,但这在服务代码中尤为重要。

此外,在服务中,特别是在客户端上,确保实现IDisposable的对象实例正确包装在WCF客户端实例的using语句EXCEPT中。要处理WCF客户端的正确处置,请查看此brief blog post以获得良好的模式。如果您使用依赖注入容器,这可能会变得棘手。您可以搜索“WCF不使用”以获取有关原因的更多详细信息。 BasicHttpBinding和WsHttpBinding的一些配置可以处理草率处理,但任何使用会话的绑定都会容易出现GC问题。

经过一些谷歌搜索,我发现了这个: 的 Creating high performance WCF services

答案 1 :(得分:0)

如果您将服务设置为单个实例多次出现,则应避免一些开销。

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class LessOverheadService: IService


然后你注意到使用net.tcp绑定比http更快(因为开销较少)。

<bindings>
  <netTcpBinding>
    <binding name="NetTcpBinding_IService" sendTimeout="00:10:00"
      maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
      <readerQuotas maxStringContentLength="2147483647" />
      <security mode="None" />
    </binding>
  </netTcpBinding>
</bindings>