WCF中的并行化
我使用Spring.NET framework创建WCF服务。这个服务是数学服务 并为客户端应用程序提供一些计算 我对多核服务器上的WCF服务并行化有疑问。简单地说 例如,我有一台20核的服务器 首先,这里是一个简化的代码WCF中的并行化,wcf,parallel-processing,task-parallel-library,spring.net,Wcf,Parallel Processing,Task Parallel Library,Spring.net,我使用Spring.NET framework创建WCF服务。这个服务是数学服务 并为客户端应用程序提供一些计算 我对多核服务器上的WCF服务并行化有疑问。简单地说 例如,我有一台20核的服务器 首先,这里是一个简化的代码 //WS interface public interface IMatlabService { List<ResultData> Calculate(byte [] data); } //WS class definition [ServiceBeha
//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
}
}
//WS接口
公共接口IMatlabService
{
列表计算(字节[]数据);
}
//WS类定义
[ServiceBehavior(命名空间=”http://server.com/MatlabService")]
公共类MatlabService:IMatlabService
{
公共IMatlabManager MatlabManager{get;set:}
//数学计算的网络方法
公共列表计算(字节[]数据)
{
var result=新列表();
//在另一个线程中做数学工作
Task Task=Task.Factory.StartNew(()=>
{
返回MatlabManager.CalculateWithFiniteElementMethod(数据);
});
result.AddRange(task.result)
返回结果;
}
}
公共接口IMatlabManager
{
列表CalculateWithFiniteElementMethod(字节[]数据);
}
公共类MatlabManager:IMatlabManager
{
公共列表CalculateWithFiniteElementMethod(字节[]数据)
{
//做一些数学作业
}
}
使用Spring.NET,我将web服务和管理器类配置为非单例
Spring.NET XML配置在这里。
<%@ ServiceHost Language="C#" Debug="true" Service="MatlabServiceService" Factory="Spring.ServiceModel.Activation.ServiceHostFactory" %>
Matlab管理器配置:
<object name="matlabManager"
type="MatlabManager"
singleton="false"/>
<object name="matlabService"
type="MatlabService"
singleton="false">
<property name="MatlabManager" ref="matlabManager"/>
</object>
MatlabService配置:
<object name="matlabManager"
type="MatlabManager"
singleton="false"/>
<object name="matlabService"
type="MatlabService"
singleton="false">
<property name="MatlabManager" ref="matlabManager"/>
</object>
web.config中的WCF服务配置
<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文件。
<%@ ServiceHost Language="C#" Debug="true" Service="MatlabServiceService" Factory="Spring.ServiceModel.Activation.ServiceHostFactory" %>
MatlabManager.CalculateWithFiniteElementMethod(data)
然而,这看起来像是对Matlab的调用。如果您可以使用并行代码重新实现该方法,您可能会获得一些性能增益
无论你做什么,分析都是理解你是否真的在加快速度的关键。记住——平行并不总是意味着更快。同步这些操作并为它们创建线程会带来开销
MatlabManager.CalculateWithFiniteElementMethod(data)
然而,这看起来像是对Matlab的调用。如果您可以使用并行代码重新实现该方法,您可能会获得一些性能增益
无论你做什么,分析都是理解你是否真的在加快速度的关键。记住——平行并不总是意味着更快。同步这些操作并为它们创建线程会带来开销