c#WCF问题速度

本文关键字:速度 问题 c#WCF | 更新日期: 2023-09-27 18:21:11

我必须在两台计算机之间进行许多串行通信,我现在使用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);
}

在接口中执行的方法是空的,因此几乎不消耗ticks

c#WCF问题速度

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

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

此外,在服务中,尤其是在客户端上,确保实现IDisposable的对象实例正确地封装在using语句中,WCF客户端实例除外。要处理WCF客户端的正确处理,请参阅这篇简短的博客文章,了解一个好的模式。如果使用依赖项注入容器,这可能会变得棘手。您可以搜索"WCF不使用using"以获取有关原因的更多详细信息。BasicHttpBinding和WsHttpBinding的一些配置可以处理草率的处理,但任何使用会话的绑定都容易出现GC问题。

经过一些谷歌搜索,我发现:创建高性能WCF服务

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

[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>