Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF中的并行化_Wcf_Parallel Processing_Task Parallel Library_Spring.net - Fatal编程技术网

WCF中的并行化

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

我使用Spring.NET framework创建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
    }
}
//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" %>

  • 我相信对于每一个客户端来说,web metod调用都是一个新的实例 MatlabService和WCF服务工作是在新线程上进行的(WCF服务 线程)和操作系统将此线程分配给CPU核心

    或者我错了,每次调用都必须创建新的服务对象 是否在ServiceBehavior属性InstanceContextMode中定义

    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)]

  • 我使用的MatlabService的web方法计算 用于并行化的System.Threading.Tasks,因此数学工作在 另一个线程(数学线程)

    对于每个调用,将在WCF服务线程和WCF服务中创建 线程是由数学线程创建的

    我不确定这是不是真的

    可能需要允许在中的WCF服务中使用多线程 并发模式

    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall,并发模式 =ConcurrencyMode.Multiple)]

  • 我想听听关于如何并行化多核CPU的web metod调用的想法。 我在谷歌上搜索了一下,但没有发现任何清晰和有用的内容,因为我使用Spring.NET framework创建WCF服务

  • 默认的实例上下文模式是PerCall,因此显式设置是多余的

  • 是的,您正在创建一个额外的线程来执行数学操作,但是您没有得到任何东西,因为在任务完成之前您一直在阻塞。事实上,它的效率较低,因为创建和管理额外线程的开销较大

  • 每个web调用都已在其自己的线程中提供服务

    我能看到的唯一添加额外并行计算的地方是在以下实现中:

    MatlabManager.CalculateWithFiniteElementMethod(data)
    
    然而,这看起来像是对Matlab的调用。如果您可以使用并行代码重新实现该方法,您可能会获得一些性能增益

    无论你做什么,分析都是理解你是否真的在加快速度的关键。记住——平行并不总是意味着更快。同步这些操作并为它们创建线程会带来开销

  • 默认的实例上下文模式是PerCall,因此显式设置是多余的

  • 是的,您正在创建一个额外的线程来执行数学操作,但是您没有得到任何东西,因为在任务完成之前您一直在阻塞。事实上,它的效率较低,因为创建和管理额外线程的开销较大

  • 每个web调用都已在其自己的线程中提供服务

    我能看到的唯一添加额外并行计算的地方是在以下实现中:

    MatlabManager.CalculateWithFiniteElementMethod(data)
    
    然而,这看起来像是对Matlab的调用。如果您可以使用并行代码重新实现该方法,您可能会获得一些性能增益

    无论你做什么,分析都是理解你是否真的在加快速度的关键。记住——平行并不总是意味着更快。同步这些操作并为它们创建线程会带来开销