- Является единственным экземпляром
- Позволяет клиентам выполнять множественные запросы к функциям (например, StartJob)
- StarJob(request) 'очереди ' запрос к TaskFactory (один экземпляр), выполняющийся по расписанию параллельных задач (реализован согласно примеру
- По мере завершения задач в фабрике задач , ответ возвращается
- Пока задача выполняется и поступает больше запросов, они помещаются в очередь (при условии, что достигнуто максимальное число одновременных вызовов)< /p>
В настоящее время мой код (показанный ниже) выполняет все запросы одновременно, не принимая во внимание максимальное количество одновременных задач планировщика.
Что мне не хватает?
Код
IService
[ServiceContract]
public interface ISupportService
{
[OperationContract]
Task 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 StartTask(TaskRequest taskRequest)
{
var tcs = new TaskCompletionSource();
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 StartTaskAsync (TaskRequest request, LockHandler lockHandler)
{
var tcs = new TaskCompletionSource();
taskFactory.StartNew(() =>
{
//Some task with tcs.SetResults()
});
return tcs.Task;
}
}
Подробнее здесь: https://stackoverflow.com/questions/387 ... be-limited