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