У меня запущено несколько потоков (приложение C #, работающее на IIS), и все они должны взаимодействовать с одним и тем же бэкэндом MQ. Чтобы минимизировать сетевой трафик, мне нужно отправлять внутренний запрос только тогда, когда есть работа, которую нужно сделать. Будет один поток для мониторинга, если есть работа, которая должна быть сделана, и он должен уведомить другие потоки, что они также должны начать обработку. Текущее решение включает в себя поток монитора, устанавливающий глобальную переменную и имеющий цикл других потоков и проверяющий это, то есть в потоке монитора:
CheckIfWorkAvailable() {
while(true) {
if (queue.Empty != true) {
workToBeDone = true;
}
}//end while loop
}
и затем в рабочих потоках:
DoWork() {
while(true) {
if (workToBeDone == true) {
//do work...
}
else {
Thread.Sleep(x seconds)
}
}//end while loop
}
Может ли поток монитора уведомлять рабочие потоки о том, когда есть над чем работать, вместо того, чтобы они просто зацикливались и спали? Рабочие потоки также устанавливают счетчик, указывающий, что они работают, и уменьшают его, когда их работа завершена, поэтому для флага workToBeDone можно установить значение false.