Не думайте о потоках как о данных. Думайте о них как о конструкциях.
Очевидно, чтобы класс A вызывал событие в классе B, B должен ссылаться на A и подписываться на его событие.
Но, честно говоря, я думаю, что вы поступаете неправильно. Имейте единственного слушателя TCP. Когда приходит сообщение, вы получаете объект веб-запроса и можете обрабатывать его в собственном потоке. При обработке потока, если вы найдете слово «Предупреждение», создайте событие для класса более высокого уровня. Затем обработайте событие и сделайте все, что нужно. Пример архитектуры:
Менеджер создает экземпляр TcpHandler и подписывается на его событие AlertReceived.
TcpHandler создает экземпляр MessageProcessor и подписывается на его событие MessageReceived.
Когда TcpHandler читает что-то из своего объекта TcpListener, запускайте класс MessageProcessor и заставляйте его читать фактические данные в другом потоке.
Запустить событие MessageReceived. Затем в классе TcpHandler обработайте событие. Если полученные данные «Alert», инициируйте событие AlertReceived.
Класс Manager поймает событие и сделает все, что пожелаете.