我使用Spring.NET框架創建WCF服務。此服務是數學服務 ,併爲客戶端應用程序提供一些計算。WCF中的並行化
我有關於多核服務器上的WCF服務並行化的問題。對於簡單的 示例我有20個內核的服務器。
首先這裏是一個簡化的代碼。
//WS interface
public interface IMatlabService
{
List<ResultData> Calculate(byte [] data);
}
//WS class definition
[ServiceBehavior(Namespace = "http://server.com/MatlabService")]
public class MatlabService: IMatlabService
{
public IMatlabManager MatlabManager{get;set:}
//web metod for math computations
public List<ResultData> Calculate(byte [] data)
{
var result = new List<ResultData>();
//do math work in another thread
Task<List<ResultData>> task = Task.Factory.StartNew<List<ResultData>>(() =>
{
return MatlabManager.CalculateWithFiniteElementMethod(data);
});
result.AddRange(task.Result)
return result;
}
}
public interface IMatlabManager
{
List<ResultData> CalculateWithFiniteElementMethod(byte [] data);
}
public class MatlabManager : IMatlabManager
{
public List<ResultData> CalculateWithFiniteElementMethod(byte [] data)
{
// do some math work
}
}
在Spring.NET中,我將web服務和管理器類配置爲不是單例。
Spring.NET XML配置在這裏。
Matlab的管理器配置:
<object name="matlabManager"
type="MatlabManager"
singleton="false"/>
MatlabService配置:從web.config中
<behavior name="Behavior1">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
<services>
<service name="matlabService"
behaviorConfiguration="Behavior1">
<endpoint address=""
binding="basicHttpBinding"
contract="IMatlabService"
bindingNamespace="http://server.com/MatlabService"/>
<endpoint contract="IMetadataExchange"
binding="mexHttpBinding"
address="mex"/>
</service>
</services>
SVC文件
<object name="matlabService"
type="MatlabService"
singleton="false">
<property name="MatlabManager" ref="matlabManager"/>
</object>
WCF服務配置。
<%@ ServiceHost Language="C#" Debug="true" Service="MatlabServiceService" Factory="Spring.ServiceModel.Activation.ServiceHostFactory" %>
我相信,每一個客戶端web梅託德調用創建 MatlabService的新實例,WCF服務的工作是做新的線程(WCF服務 線程)和OS分配此線程CPU核心。
或者我錯了,每次調用都會創建新的服務對象我必須在ServiceBehavior屬性中定義一個 InstanceContextMode?
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
在web方法MatlabService的計算我使用 System.Threading.Tasks用於並行所以數學工作是 做另一個線程(線程數學) 。
對於每個調用都創建WCF服務線程和WCF服務 線程創建數學線程。
我不確定這是否屬實。
也許需要允許多線程在WCF服務 併發模式?
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,ConcurrencyMode = ConcurrencyMode.Multiple)
我想聽到的想法如何可以並行網絡對多核心CPU梅託德調用。 我谷歌它,但沒有找到任何明確和有用的,因爲我使用春天。用於創建WCF服務的.NET框架。