С# Как реализовать ожидание подтверждения при передаче данных?

У меня есть класс, который должен отправлять/получать данные в пакетной форме. Этот класс содержит обработчик событий, который запускается, когда новые данные доступны для чтения с физического носителя.

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

Пока все хорошо... Теперь к моему вопросу. Хотя приведенный выше сценарий работает для распределения входящих данных среди множества подписчиков и размещения логики дальнейшей обработки выше в приложении, у меня возникает проблема:

Иногда класс получает пакет данных, который является просто ответом (например, ACK/FAIL) на другой пакет, отправленный классом.

Как мне реализовать метод для отправки чего-то, что будет ждать такого подтверждения, не нарушая при этом вышеупомянутую концепцию обработки входящих необработанных данных в обработчике событий?

Некоторый псевдокод для иллюстрации проблемы:

class CommCenter
{
    public event NewPacketAvailable;

    private void _newRawDataAvailable_EventHandler
    {
        // read incoming data from physical medium

        // parse incoming data for packet structure
        // the received packet may either contain a reply to
        // a previously sent message or unrelated

        // if packet found raise NewPacketAvailable event
        // so that subscribers can handle the packet
    }


    public void SendMessage(DataPacket packet, Int32 timeoutInMilliseconds)
    {
        // put message on the physical medium

        // wait for a packet confirming the previously sent packet
        // How would I have to do this??
        // the packet confirmation would arrive in _newRawDataAvailable_EventHandler
    }
}

Возможно, у него есть хорошая идея или даже реализована такая логика раньше. Я немного смущен в данный момент, что делать. Рад за любую помощь или указатели в правильном направлении ;-)


person Timo Kosig    schedule 25.11.2009    source источник
comment
Да, смотрите мой ответ для краткого объяснения того, как я решил проблему. Если вам нужны какие-либо подробности, дайте мне знать, и я буду рад уточнить.   -  person Timo Kosig    schedule 05.02.2010


Ответы (1)


Хорошо, вот как это работает:

В обработчике события прочитать данные с носителя. Проверьте, это данные или просто подтверждение предыдущего пакета (ACK).

Если это данные, передайте их дальше.

Если это ACK, поместите его в специальный Queue для ACK.

В методе SendMessage повторяйте этот ACK Queue после отправки вашего сообщения до тех пор, пока:

  1. Происходит тайм-аут
  2. Приходит подтверждение отправленного вами пакета

Вот и все.

person Timo Kosig    schedule 05.02.2010