2017-06-19 17 views
0

私は、マルチスレッドクライアントが並列要求数を処理するために使用するWCFを持っています。何とか2つの異なるリクエスト/スレッドのデータを共有し始めます。私は次のようInstanceContextModeConcurrencyModeを変更しようとしました:WCF並行性とマルチスレッドクライアント

  • デフォルトInstanceContextMode = PerSession ConcurrencyMode =シングル
  • InstanceContextMode = PerCall ConcurrencyMode =シングル
  • InstanceContextMode = PerCall ConcurrencyMode =複数

しかし、これまで運がなかった。この並行性の問題を引き起こす可能性のある共有変数および関数はありません。 MSの文書PerCallによれば、個々の呼び出しごとにインスタンスが作成され、独自のプライベートメモリスタックを持つインスタンス間でデータを共有する方法は意味をなさない。

ワークフロー: WCF、.Netアセンブリ1と.Netアセンブリ2の3つの主要コンポーネントがあります。WCFの "Process"という名前の関数があり、これは文字列パラメータを受け取り、処理された構造化オブジェクトを返しますWCF。 WCFにインスタンス変数はありません。機能のすべて。この関数は文字列をほとんど処理せずに構造化オブジェクトに変換し、アセンブリ1の関数に渡して処理を行い、その後、呼び出しの呼び出しメソッドを使用してアセンブリ2の関数に渡します。これは、2つの異なる同時呼び出しの最終結果をどうにかして混合するプロセス全体です。

誰でもこの問題を解決することができれば、本当に感謝しています。

+0

私たちはより多くのコードを参照する必要があります。共有変数がない場合、どのようにデータを共有できますか? – Laurijssen

+0

ここにコード全体を公開することはできませんが、コードのワークフローとその仕組みについてのアイデアを伝えます。 –

答えて

0

これらのリクエストを並行して実行したいのですが、実行している順番に実行したくないのですか? configファイルにserviceThrottlingを追加することで問題はありません。私の設定は次のようになります:

<system.serviceModel> 
    <services> 
     <service name="TeleEcgService.Service"> 
     <endpoint address="" binding="basicHttpBinding" contract="TeleEcgService.IService"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior> 
      <serviceThrottling maxConcurrentCalls="100" maxConcurrentSessions="1" maxConcurrentInstances="100"/> 
      <!-- To avoid disclosing metadata information, set the values below to false before deployment --> 
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <protocolMapping> 
     <add binding="basicHttpsBinding" scheme="https"/> 
    </protocolMapping> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/> 
    <bindings> 
     <basicHttpBinding> 
     <binding maxReceivedMessageSize="50000000"> 
      <!-- 
      <security mode="Transport"> 
      </security> 
      --> 
     </binding> 
     </basicHttpBinding> 
    </bindings> 
    </system.serviceModel> 

ご覧のとおり、最大100個の並列要求があります。私はデフォルトを使用しますInstanceContextModeConcurrencyMode