具有并发任务的单实例 WCF 服务(可以限制)
Single instance WCF service with concurrent tasks (that can be limited)
我正在尝试构建一个 WCF 服务 -
- 是单实例
- 允许客户端向功能发出多个请求(例如 StartJob)
StarJob(request) 'queues' 对 TaskFactory(一个实例)的请求 运行 在并发任务计划中(根据 example
任务工厂中的任务完成后返回响应
- 当一个任务 运行 并且有更多请求进入时,它们会排队(前提是已达到最大并发数)
Objective是搭建一个接受客户端请求并排队处理的系统
目前,我的代码(如下所示)同时运行所有请求,而不考虑任务调度程序的最大并发数。
问题
- 我错过了什么?
- 有什么好的example/reference可以看看吗? (我相信这不是一个罕见的用例)
代码
我服务
[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;
}
}
啊啊啊!对我来说是个大小姐。 taskFactory
中执行的操作比我预期的要完成。因此,所有任务 似乎 是 运行 并行的。
我更新了操作代码以正确监控操作完成并引发正确的回调,上面的代码工作正常。
但是,做了一个小改动-
- 不需要
StartTask(TaskRequest taskRequest)
到return一个Task
。相反,只需 returning TaskResponse
就足够了(因为 WCF 负责每个 OperationContract
的异步和同步功能)
我正在尝试构建一个 WCF 服务 -
- 是单实例
- 允许客户端向功能发出多个请求(例如 StartJob)
StarJob(request) 'queues' 对 TaskFactory(一个实例)的请求 运行 在并发任务计划中(根据 example
任务工厂中的任务完成后返回响应
- 当一个任务 运行 并且有更多请求进入时,它们会排队(前提是已达到最大并发数)
Objective是搭建一个接受客户端请求并排队处理的系统
目前,我的代码(如下所示)同时运行所有请求,而不考虑任务调度程序的最大并发数。
问题
- 我错过了什么?
- 有什么好的example/reference可以看看吗? (我相信这不是一个罕见的用例)
代码
我服务
[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;
}
}
啊啊啊!对我来说是个大小姐。 taskFactory
中执行的操作比我预期的要完成。因此,所有任务 似乎 是 运行 并行的。
我更新了操作代码以正确监控操作完成并引发正确的回调,上面的代码工作正常。
但是,做了一个小改动-
- 不需要
StartTask(TaskRequest taskRequest)
到return一个Task
。相反,只需 returningTaskResponse
就足够了(因为 WCF 负责每个OperationContract
的异步和同步功能)