0

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

接口中执行的方法是空的,所以几乎不消耗tick

4

2 回答 2

2

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

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

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

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

于 2013-07-04T09:11:03.030 回答
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>
于 2013-07-04T09:29:07.467 回答