【问题标题】:Single instance WCF service with concurrent tasks (that can be limited)具有并发任务的单实例 WCF 服务(可以限制)
【发布时间】:2016-08-04 06:46:37
【问题描述】:

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

  1. 是单实例
  2. 允许客户端向函数发出多个请求(例如 StartJob)
  3. StarJob(request) 将请求“排队”到在并发任务计划上运行的 TaskFactory(一个实例)(根据 example 实现)

  4. 随着任务工厂中的任务完成,返回响应

  5. 当任务正在运行并且有更多请求进入时,它们会排队(前提是达到最大并发数)

目标是建立一个系统,接受来自客户端的请求并将它们排队处理。

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

问题

  1. 我错过了什么?
  2. 我可以查看任何好的示例/参考吗? (我相信这不是一个不常见的用例)

代码

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;
    }    
}

任务请求处理程序

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;
    }
}

【问题讨论】:

标签: c# wcf concurrency taskscheduler


【解决方案1】:

啊啊啊!对我来说是一个很大的失误。 taskFactory 中执行的操作在我预期之前完成。因此,所有任务似乎都在并行运行。

我更新了动作代码以正确监控动作完成并引发正确的回调,上面的代码运行良好。

但是,做了一个小改动 -

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多