Я использую (откровенно большой) тип BlockingCollection<>
для сильно многопоточного высокопроизводительного приложения.
Там много пропускной способности через коллекцию, и на микроуровне она очень эффективна. Тем не менее, для каждой "партии" он всегда будет завершен, помечая токен отмены. Это приводит к тому, что исключение вызывает любой ожидающий вызов Take
. Это хорошо, но я бы установил для возвращаемого значения или выходного параметра, чтобы сигнализировать об этом, потому что a) исключения имеют очевидные накладные расходы и b) при отладке я не хочу вручную отключать исключение break-on-exception для этого конкретного исключение.
Реализация кажется интенсивной, и, теоретически, я могу разобрать и воссоздать мою собственную версию, которая не использовала исключения, но, возможно, существует менее сложный способ?
Я мог бы добавить объект null
(или если нет, заполнитель) в коллекцию, чтобы обозначить, что процесс должен завершиться, однако также должно быть средство для прекращения красиво, т.е. пробуждение ожидающих потоков и рассказать им как-то что-то продолжалось.
Итак - альтернативные типы коллекций? Воссоздайте свой собственный? Какой-то способ злоупотреблять этим?
(В некотором контексте: я пошел с BlockingCollection<>
, потому что у него есть преимущество перед ручным блокированием вокруг Queue
. Насколько я могу сказать, использование примитивов для потоковой обработки превосходно и в моем случае - несколько миллисекунд здесь - и - там и оптимальное ядро имеет решающее значение.)
Изменить: я только что открыл щедрость для этого. Я не верю, что ответ Анастасиоляля охватывает вопрос, который я поднимаю в своих комментариях. Я знаю, что это сложная проблема. Кто-нибудь может помочь?