Как ждать внешнего ответа с обратными вызовами? - PullRequest
0 голосов
/ 10 ноября 2018

Я довольно много искал по этой теме, но мне кажется, что я не использую подходящие слова для поиска среди всего этого, потому что я еще не нашел ответа.

Я ищу способ заставить процесс ждать (определенного) ответа от внешнего источника.

Более подробно, в стандартном сокетном соединении я спрашиваю у моей удаленной конечной точки определенное значение через socket.send, как я могу "перехватить" их ответ? У меня уже была идея отправить какой-то идентификатор, чтобы определить, к какому запросу это относится.

Есть ли способ эффективно достичь этого? (Производительность довольно важна). В настоящее время я использую .NET2.0, если это актуальная информация.

Пример кода:

    public void AskForReply()
    {
        //Send to connected endpoint
    }

    public void ReceiveReply(IAsyncResult response)
    {
        //Do stuff with the response
    }

Я разработал несколько идей в моей голове. Но все они чувствуют себя действительно грязно и не очень эффективно. Есть ли шаблон дизайна для этого? Существуют ли стандарты для такого поведения?

И помощь очень ценится!

1 Ответ

0 голосов
/ 20 ноября 2018

Для тех, кто сталкивается с подобной проблемой, я нашел способ сделать асинхронный вызов синхронным (что по сути является тем, чего вы пытаетесь достичь).

    EventWaitHandle waitHandler;
    string replyMessage;

    void string AskForReply()
    {
        //Already requesting something...
        if(waitHandler != null) { return; }
        waitHandler = new EventWaitHandle(false, EventResetMode.AutoReset);

        //Send a request to a remote service

        waitHandler.WaitOne(timeout);

        //Will reply null (or the default value) if the timeout passes.
        return replyMessage;
    }

    void ReceiveReply(string message)
    {
        //We never asked for a reply? (Optional)
        if (waitHandler != null) { return; }
        replyMessage = message;
        //Process your reply

        waitHandler.Set();
        waitHandler = null;
    }

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

...