具有并发任务的单实例WCF服务(可以限制)

时间:2016-08-04 06:46:37

标签: c# wcf concurrency taskscheduler

我正在尝试构建一个WCF服务 -

  1. 是单一实例
  2. 允许客户端向函数发出多个请求(例如,StartJob)
  3. StarJob(请求)'队列'对Concurrent任务计划运行的TaskFactory(一个实例)的请求(按照example实现

  4. 当任务工厂中的任务完成后,将返回响应

  5. 当任务正在运行且有更多请求进入时,它们会排队(提供最大并发数)
  6. 目标是构建一个系统,接受来自客户端的请求并将它们排队等待处理。

    目前,我的代码(如下所示)同时运行所有请求,而不考虑任务调度程序的最大并发数。

    问题

    1. 我错过了什么?
    2. 我可以看一下好的例子/参考吗? (我确信这不是一个不常见的用例)
    3. 代码

      IService

      [ServiceContract]
      public interface ISupportService
      {
          [OperationContract]
          Task<TaskResponse> StartTask(TaskRequest taskRequest);
      }
      

      服务

      [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]
      public class SupportService : ISupportService
      {
          private static TaskRequestHandler taskRequestHandler;
      
          public SupportService()
          {        
              taskRequestHandler = TaskRequestHandler.GetInstance();         
          }
      
          public Task<TaskResponse> StartTask(TaskRequest taskRequest)
          {
              var tcs = new TaskCompletionSource<TaskResponse>();
      
              if (!IsTaskRequestValid(taskRequest))
                  tcs.SetResult(new TaskResponse()});
      
              taskRequestHandler.StartTaskAsync(taskRequest, lockHandler).ContinueWith(task => { tcs.SetResult(task.Result); });
      
              return tcs.Task;
          }    
      }
      

      TaskRequestHandler

      public class TaskRequestHandler
      {
          private ConcurrentTaskScheduler taskScheduler;
          private TaskFactory taskFactory;
      
          private TaskRequestHandler()
          {
              taskScheduler = new ConcurrentTaskScheduler(2);
              taskFactory = new TaskFactory(taskScheduler);
          }
      
          private Task<TaskResponse> StartTaskAsync (TaskRequest request, LockHandler lockHandler)
          {
              var tcs = new TaskCompletionSource<TaskResponse>();
              taskFactory.StartNew(() =>
              {
                  //Some task with tcs.SetResults()
              });
      
              return tcs.Task;
          }
      }
      

1 个答案:

答案 0 :(得分:0)

AAAAH!对我来说是个大错过。 Error in new.env(parent = formenv) : use of NULL environment is defunct中执行的操作在我预期之前完成。因此,所有任务都要并行运行。

我更新了操作代码以正确监视操作完成并提出正确的回调,上面的代码运行正常。

然而,做了一个小改动 -

  • taskFactory无需返回StartTask(TaskRequest taskRequest)。相反,只返回Task就足够了(因为WCF负责每个TaskResponse的异步和同步功能)