我正在尝试构建一个WCF服务 -
StarJob(请求)'队列'对Concurrent任务计划运行的TaskFactory(一个实例)的请求(按照example实现
当任务工厂中的任务完成后,将返回响应
目标是构建一个系统,接受来自客户端的请求并将它们排队等待处理。
目前,我的代码(如下所示)同时运行所有请求,而不考虑任务调度程序的最大并发数。
问题
代码
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;
}
}
答案 0 :(得分:0)
AAAAH!对我来说是个大错过。 Error in new.env(parent = formenv) : use of NULL environment is defunct
中执行的操作在我预期之前完成。因此,所有任务都要并行运行。
我更新了操作代码以正确监视操作完成并提出正确的回调,上面的代码运行正常。
然而,做了一个小改动 -
taskFactory
无需返回StartTask(TaskRequest taskRequest)
。相反,只返回Task
就足够了(因为WCF负责每个TaskResponse
的异步和同步功能)