Я создаю механизм фоновой обработки, который поддерживает отбрасывание как подлежащих обработке, так и обрабатываемых элементов. Это для использования в приложении winforms, которое потребует интенсивной обработки некоторых входных элементов, поэтому я создаю механизм очереди, в котором я могу ставить в очередь элементы рабочей нагрузки, и когда они обрабатываются, я получаю уведомление с результатами.
Вопрос в том, что эта очередь почти всегда будет содержать много элементов для начала, и я подумал, что вместо того, чтобы просто сбрасывать все в пул потоков, я бы поместил в пул только первые N элементов и продолжал заполнять, когда они обработанный. Причина, по которой я хочу это сделать, заключается в том, что как только я выгружу их в пул потоков, они будут обработаны, и даже если они помечены как отбрасываемые, они все равно будут занимать время в очереди.
С реализацией обратной засыпки, которую я сделал, я могу удалять элементы из очереди, если они выбрасываются, и помещать их в очередь только тогда, когда, так сказать, наступает их очередь.
Итак, вопрос в том, как мне вычислить это число N, количество элементов, которые нужно поместить и сохранить в очереди пула потоков.
Проблемы, которые я рассмотрел:
- Я мог бы захотеть поставить в очередь 2 * количество процессоров, что, как я вижу, является типичным количеством элементов, чтобы убедиться, что все процессоры работают.
- Однако, если фактическая обработка некоторых элементов происходит сверхбыстро (что может случиться), то очередь в пуле потоков исчерпана до того, как мой собственный класс сможет заполнить дополнительную работу, поэтому, возможно, я хотел бы большее число, чтобы избежать недостаточного использования процессоры
- Должен ли я создать некоторую процедуру автоматической настройки для расчета оптимального числа на основе текущего времени, которое занимает каждый элемент, чтобы, если они все супербыстрые, число было намного выше, и если обработка занимает немного времени, оно должно оставаться низкий?
Как вы думаете?
Новинка: хорошо, из-за одного из ответов я объясню немного больше. Каждый элемент, помещенный в очередь, имеет уникальный ключ. Если я помещаю в очередь другой элемент с тем же ключом, что и у существующего элемента, этот старый элемент считается «отброшенным» и должен быть удален. Если элемент обрабатывается, свойству элемента рабочей нагрузки присваивается значение true, свойству IsDicarded, за вызов которого отвечает метод обработки. Если он обнаруживает отброшенный элемент, он должен выйти раньше, не возвращая никаких результатов.
Возможно, мне следует еще немного поэкспериментировать и попытаться просто сбросить все в пул потоков.
Новый вопрос: есть ли ограничение на количество элементов, которые я могу поставить в очередь? Если нет, то это легко упростит мой класс.
Примечание. Когда я говорю "длительная обработка", я имею в виду от 1 до 10 секунд. Является ли threadpool даже лучшим для этого? Я вижу во всем Интернете заметки о том, что «обработка должна быть быстрой», но никогда не упоминается, что такое «быстрая». Здесь быстро порядка миллисекунд?