2017-06-19 113 views
0

我有一個多線程客戶端用於處理並行請求數的WCF。不知怎的,它開始共享兩個不同請求/線程的數據;我曾試圖改變InstanceContextModeConcurrencyMode如下:WCF併發多線程客戶端

  • 默認InstanceContextMode = PerSession ConcurrencyMode =單
  • InstanceContextMode = PerCall ConcurrencyMode =單
  • InstanceContextMode = PerCall ConcurrencyMode =多

但到目前爲止沒有運氣。沒有可能導致此併發問題的共享變量和函數。根據MS文檔PerCall爲每個單個調用創建實例,並且當實例擁有自己的專用內存堆棧時如何共享數據沒有任何意義。

工作流程: 有三個主要組件WCF,.Net Assembly 1和.Net Assembly 2.有一個名爲WCF的「Process」函數,該函數接受一個字符串參數,並根據通過完成的處理返回結構化對象WCF。 WCF中沒有實例變量;功能中的所有內容。該函數對字符串做了很少的處理,並將其轉換爲結構化對象,然後將其傳遞給Assembly 1的函數做一些處理,然後使用反射的invoke方法將它傳遞給Assembly 2的函數。這是以不同方式混合兩個不同併發呼叫的最終結果的整個過程。

如果有人能夠幫助解決這個問題,我會非常感激。

+0

我們需要看到更多的代碼。沒有共享變量時如何共享數據? – Laurijssen

+0

在這裏發佈整個代碼是不可能的,但我可以給你一個關於代碼工作流程以及它如何工作的想法。 –

回答

0

您是否希望將這些請求並行執行,但不是按順序執行?在配置文件中添加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