- Число потоков задаётся константой в классе пула или параметром конструктора.
- У каждого потока есть два состояния: ожидание задачи, выполнение задачи
- Задача — вычисление некоторого значения, описывается в виде Func и инкапсулируется в объектах интерфейса IMyTask
- Добавление задачи осуществляется с помощью нестатического метода класса пула Enqueue(IMyTask a).
- При добавлении задачи, если в пуле есть ожидающий поток, то он должен приступить к ее исполнению. Иначе задача будет ожидать исполнения.
- Если в какой-то момент у потока нет задачи, то он забирает задачу из очереди другого потока.
- Класс должен быть унаследован от интерфейса IDisposable и корректно освобождать ресурсы при вызове метода Dispose().
- Метод Dispose должен завершить работу потоков. Завершение работы коллаборативное, с использованием CancellationToken — уже запущенные задачи не прерываются, но новые задачи не принимаются на исполнение потоками из пула. Возможны два варианта решения --- дать всем задачам, которые уже попали в очередь, досчитаться, либо выбросить исключение во все ожидающие завершения задачи потоки
IMyTask:
- Свойство IsCompleted возвращает true, если задача выполнена
- Свойство Result возвращает результат выполнения задачи
- В случае, если соответствующая задаче функция завершилась с исключением, этот метод должен завершиться с исключением AggregateException, содержащим внутри себя исключение, вызвавшее проблему