Вы можете использовать очередь возврата. Если один из элементов генерирует ошибку / исключение, вы можете загрузить его с данными об ошибках и поставить его в очередь производителю. Производителю следует попробовать TryTake () из очереди возврата непосредственно перед созданием нового элемента и соответствующим образом обработать любой возвращенный элемент. Это лучше, чем использование некоторого атомарного логического значения, позволяющего элементу отправлять обратные сигналы с расширенной информацией об ошибках, которая может быть использована для принятия решения о том, какое действие предпринять - производитель не всегда хочет / должен останавливаться. Кроме того, вы можете затем поставить ошибочные элементы в очередь в список графического интерфейса и / или регистратор.
Соблазнительно сказать, что потребитель должен возвращать товары в любом случае, независимо от того, ошибочны они или нет, чтобы их можно было повторно использовать вместо создания новых. Это, однако, создает задержку при обнаружении / воздействии на ошибки, если только вы не используете две очереди возврата для определения приоритетов ошибок.
Да, еще одна вещь - используя описанный выше дизайн, если он должен остановиться, производитель может сохранить элементы с ошибками в локальной очереди, переиздавая время от времени. Если сервер возвращается (как указано в возврате успешного элемента), производитель может повторно выполнить ошибочные задания из локальной очереди, прежде чем генерировать новые. Осторожно, это может сделать вашу систему загрузки устойчивой к перезагрузкам сервера.