C# Как да внедрим изчакване за потвърждение в комуникацията на данни?

Имам клас, който трябва да изпраща/получава данни в пакетна форма. Този клас съдържа манипулатор на събития, който се изпълнява, когато са налични нови данни за четене от физическия носител.

В манипулатора на събития чета данните от носителя и анализирам наличните данни за пълни пакети. След като пакетът бъде идентифициран, възниква събитие за предаване на новия пакет на абонатите. Абонатите на това събитие решават дали искат да използват пакета или не.

Дотук добре... Сега към въпроса ми. Докато сценарият по-горе работи за разпространение на входящите данни до множество абонати и поставяне на допълнителна логика за обработка по-нагоре в приложението, това ме оставя с проблем:

Понякога класът ще получи пакет от данни, който е просто отговор (помислете за 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