Что я пытаюсь реализовать:
Планировщик задач, который ставит задачи в очередь и выполняет заданное количество задач параллельно, в то время как другие ждут в очереди, чтобы начать работу. У каждой задачи есть время ожидания, которое начинает отсчитываться при запуске задачи, и если оно превышает это время, задача отменяется и генерирует исключение TimeoutException, которое обрабатывается в ContinueWith (или какой-либо задаче, которая запускается сразу после нее). Задачи должны быть отменены пользователем.
Что я получаю:
Когда первая задача терпит неудачу, все остальные тоже мгновенно терпят неудачу.
Вот полный код моего планировщика заданий (взято из MSDN с некоторыми изменениями):
http://pastebin.com/KSMbDTH5. (рассматриваемая функция находится в строке 161)
Вот пример использования:
var taskTokens = new List<CancellationToken>();
var factory = new TaskScheduleFactory(new ParallelOptions() { MaxDegreeOfParallelism = 1 }); //for the purpose of testing, supposed to work and with higher values
for (var i = 0; i < 10; i++)
{
//TaskScheduleFactory.cs, line 161
var taskToken = factory.Add(
(token) => //Task
{
Console.WriteLine("Start");
Thread.Sleep(5000);
if (token.IsCancellationRequested) return; //Cancelled by timeout
Console.WriteLine("This should not print");
},
(task) => //ContinueWith
{
if (task.IsFaulted)
{
Console.WriteLine("Fail");
}
else if (!task.IsCompleted)
{
Console.WriteLine("Not completed");
}
else Console.WriteLine("Done");
},
2000 //Timeout
);
taskTokens.Add(taskToken);
}
Как это должно работать: (мы инициируем событие тайм-аута через 2 секунды, чтобы ни одна задача не завершилась)
Для MaxDegreeOfParallelism = 1:
Start;
(Wait 2sec)
Fail;
Start;
(Wait 2sec)
Fail;
....
Для MaxDegreeOfParallelism = 2:
Start;
Start;
(Wait 2sec)
Fail;
Fail;
Start;
Start;
(Wait 2sec)
Fail;
Fail;
....
Как это работает:
Start;
(Wait 2sec)
Fail;
Fail;
Fail;
Fail;
...
(для MaxDegreeOfParallelism = 1 остальные тоже бардак)
Примечание: это мои первые шаги в TPL, так что извините за глупость с моей стороны.