Я обычно использую стандартную очередь и ключевое слово lock при чтении или записи. Кроме того, метод Synchronized в очереди устраняет необходимость использования блокировки. System.Threading.Semaphore - лучший инструмент для уведомления рабочих потоков о появлении новых заданий для обработки.
Пример добавления в очередь
lock ( myQueue) { myQueue.Enqueue(workItem); }
mySemaphore.Release();
Пример обработки рабочего элемента:
mySemaphore.WaitOne();
lock (myQueue) { object workItem = myQueue.Dequeue(); }
// process work item
Настройка семафора:
mySemaphore = new Semaphore(0, int.MaxValue);
Если это слишком медленно, и накладные расходы на синхронизацию по-прежнему преобладают в вашем приложении, вы можете рассмотреть возможность отправки более одного рабочего элемента за раз.
В зависимости от того, что вы делаете, новые функции распараллеливания в .NET 4.0 также могут быть очень полезны для вашего приложения (если это вариант).