Чем-то похоже на прерывания.
Если чего-то произошло - генерируется в системе эдакий аналог прерывания - событие. Оно, кнеш, не прерывание, но если от какого-то модуля есть делегат - событие для него сгенерится, по событию прога будет направлена в процедуры обработки события во всех модулях, для которых есть делегат.
Вернее - для всех классов, ибо С# весь фгавно ООПнутый и там модули стоит оформлять исключительно в виде классов

Иначе тоже можно, но заплюють
Я на событиях делал интерфейсу. Когда дочернее окошко должно ездить за материнским (как в винампе его эквалайзер, плейлисти т.д.) т.е. - если потянул за само дочернее - оно отъехало и отключило обработчик события перемещения материнской формы.
Если тыцнул кнопу, или притащил дочернее к материнскому на расстояние менее 20 экранопикселей - дочернее активирует обработчик события и приперетаскивании мамаши - слышит это событие и переставляет себя следом.
Вот такое же тебе и надо - класс Recieve заловил фрейм данных, нужной тебе длины. Это должно сгенерить событие.
В модуле, ответственном за обработкуэтого фрейма, должен быть объявлен делегат. Он услышит событие и войдёт в процедуру обработки.
Собсно - без событий никуда. Это уже ООП, а принцип ООП - антогонист линейного (оно же процедурное) программирования.