Как в C# передать сообщение из дочернего потока в главный?
Есть класс Dispatcher. Думаю он решит вашу проблему
queue прикрутить. один поток выгребает из очереди все и делает дело, остальные потоки дергают платы и если надо - добавляют сообщение в очередь.
на примитивах типа Monitor.Wait / Monitor.Pulse очередь очень простая получается. 
заодно решается проблема, когда значения изменяются быстрее, чем обрабатывается факт изменений.