Сначала вы должны изучить основы многопоточного программирования, так что, пошло.
Попробуйте что-нибудь по этому поводу:
// shared queue
ConcurrentQueue<T> queue = new ConcurrentQueue<T>();
// shared wait handle
AutoResetEvent autoEvent = new AutoResetEvent();
Очередь здесь лучше, чем список, потому что она позволяет добавлять и удалять элементы из нее, не беспокоясь об индексе текущего элемента - вы просто Enqueue()
элементы для другого и и Dequeue()
их для другой. Используйте класс из System.Collections.Concurrent
пространства имен, который автоматически обрабатывает потокобезопасный доступ для вас (и из-за сложных причин, по которым вы захотите читать позже, быстрее, чем простой lock()
).
Теперь поток переднего плана:
// schedule the work
queue.Enqueue(itemOfWork);
// and wake up our worker
autoEvent.Set();
Волшебная часть здесь - это Set()
, вызываемая нашим WaitHandle
(да, AutoResetEvent
- это реализация WaitHandle
). Он пробуждает единственный поток, который ожидал срабатывания события синхронизации, без использования таких уродливых конструкций, как Thread.Sleep()
. Вызов Sleep()
почти всегда является признаком ошибки в многопоточном коде!
Хорошо, для последней части - рабочий поток. Здесь не так много изменений:
while(true)
{
// wait for the signal
autoEvent.WaitOne();
T item;
// grab the work item
queue.TryDequeue(out item);
// handle the item here;
}