0

2台のコンピューター間で多くのシリアル化通信を行う必要があります。現在、これには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);
}

インターフェイスで実行されるメソッドは空であるため、ティックをほとんど消費しません

4

2 に答える 2

2

WCF サービスと WCF クライアント (ClientBase または ChannelFactory を直接使用) の両方での運用パフォーマンスの問題の一部は、ずさんなオブジェクト処理のために .NET ガベージ コレクターが多くの作業を行うことを余儀なくされていることが原因です。パフォーマンス モニターを使用して、実行時の .NET ガベージ コレクターの動作をチェックし、これがスパイクの原因であるかどうかを確認します。

GC の問題である場合は、サービスとクライアント コードを確認する必要があります。サービスでは、オブジェクト インスタンスのスコープが可能な限り制限されていることを確認します。これにより、最も頻繁に発生する Gen0 でインスタンスの大部分がガベージ コレクションされるようになります。クライアント コードも確認する必要がありますが、サービス コードでは特に重要です。

また、両方のサービスで、特にクライアントで、IDisposable を実装するオブジェクト インスタンスが、WCF クライアント インスタンスの EXCEPT ステートメントを使用して適切にラップされていることを確認してください。WCF クライアントの適切な破棄を処理するには、この短いブログ投稿で適切なパターンを確認してください。依存性注入コンテナーを使用している場合、これは注意が必要です。理由の詳細については、「WCF do not use using」を検索してください。BasicHttpBinding と WsHttpBinding の一部の構成は、ずさんな破棄を処理できますが、セッションを使用するバインディングは GC の問題が発生しやすくなります。

いくつかのグーグル検索の後、私はこれを見つけました: Creating high performance WCF services

于 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 に答える