Эм, а это не может быть просто технология push уведомлений?
В тот же google play она нативно вшита и держит постоянный tcp connection к серверам гугла.
У приложений есть выбор: использовать нотификацию через play, открывать свой коннект с серверам гугла или использовать третьего провайдера, т.е коннект к "своим" серверам
Я обычно сохраняю ссылку на каждый экземпляр потока (объект Thread) в коллекции или массиве. Там можно проверять свойство IsAlive, ну и прибить тоже можно, если нужно (метод Abort() )
Так введите переменную счетчик, как запускаете задачу, то сразу Interlocked.Increment(ref counter); как завершаете, то Interlocked.Decrement(ref counter);. Достиг нуля значит надо вызвать eventCompleted
Должен вас огорчить, но фраза "пхп создан для того чтобы умирать" относится как раз к вашей проблеме. В ядре самого языка не предусмотрен сценарий "вечной" работы скрипта. Память расходуется неэффективно и Fatal error: Out of memory - это то что ждёт ваш скрипт при любом раскладе.
Самое простое решения в вашем случае: дёргать ваш проверочный скрипт кроном (cron). Скажем, каждую минуту, давать ему отработать и умереть. И так каждую минуту.