По сути, вы говорите, что если принтер занят, перезапишите ваш объект printWorker другим работником и запустите его. Тогда у вас нет ссылки на ваш старый рабочий объект и вы не выполняете никакой очистки.
Есть все виды проблем с этим.
- По окончании работы фоновые рабочие должны быть утилизированы для предотвращения утечек.
- Создание дополнительных фоновых работ не означает, что принтер будет работать быстрее, это просто означает, что у вас есть больше работников, пытающихся одновременно получить доступ к принтеру.
Что вам нужно сделать, так это подумать об организации очереди. Я бы сказал, что у вас есть два основных варианта.
Первый - Использовать ThreadPool.QueueUserWorkItem (...)
ThreadPool.QueueUserWorkItem(new WaitCallback(o=>{printWorker_DoWork();}));
При этом будет использоваться пул потоков .net для постановки ваших задач в очередь и их обработки в пуле. (Пул автоматически изменит размер до соответствующего количества потоков для обработки ваших запросов в очереди). Это не требует утилизации или очистки, вы просто запускаете и забываете, хотя вы должны знать, что рабочие элементы не гарантированно будут обрабатываться в том же порядке, в котором вы их добавляете (скорее всего, некоторые будут обрабатываться одновременно), так что если Вы заботитесь о порядке, это не хорошо.
Второе - внедрить шаблон очереди потока источника-потребителя . Это требует синхронизированной очереди, в которую один поток или потоки (производитель) добавляют элементы, а другие потоки (потребители) удаляют и обрабатывают эти элементы. Если вы новичок в многопоточности, это может быть довольно сложно сделать правильно, так как вы должны убедиться, что ваше чтение / запись в общую очередь правильно синхронизированы, чтобы порядок сохранялся и ничего не терялось.
Будьте осторожны с типом Queue , хотя он может использоваться, но сам по себе он не является поточно-ориентированным. Убедитесь, что если вы используете его, вы добавите некоторые свои собственные блокировки и синхронизации.
со страницы MSDN:
Любые члены экземпляра не гарантируют поточно-ориентированность.
Очередь ) может поддерживать несколько считывателей одновременно, если коллекция не изменена. Тем не менее, перечисление в коллекции по сути не является потокобезопасной процедурой. Чтобы гарантировать безопасность потоков во время перечисления, вы можете заблокировать коллекцию во время всего перечисления. Чтобы обеспечить доступ к коллекции из нескольких потоков для чтения и записи, необходимо реализовать собственную синхронизацию.
Я бы порекомендовал более простой первый вариант, если вас не интересует порядок, но если вы обнаружите, что вам нужен более точный контроль над очередями и обработкой, или порядок важен, то есть когда вы можете перейти к более сложный шаблон - если вы перейдете по ссылкам внизу статьи, вы найдете примеров и исходный код , в качестве альтернативы вы можете просто использовать класс Queue и убедиться, что вы получите блокировка вправо.