如何等待带有回调的外部响应?

时间:2018-11-10 02:44:09

标签: c# sockets asynchronous networking

我已经在这个主题上进行了很多搜索,但是我认为我没有使用正确的词来搜索这些东西,因为我还没有找到答案。

我正在寻找一种使流程等待外部源(特定)响应的方法。

更详细地讲,在标准套接字连接中,我通过socket.send向远程端点询问某个值,如何“捕获”他们的答复?我已经拥有的想法是发送某种标识符来确定它属于什么请求。

有没有一种方法可以有效地实现这一目标? (性能非常重要)。如果相关信息,我目前正在使用.NET2.0。

一些示例代码:

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

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

我一直在想出几个主意。但是他们都感到非常混乱,效率不高。是否有设计模式?有这种行为的标准吗?

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

对于遇到类似问题的任何人,我都找到了一种使异步调用同步的方法(这实际上是您要实现的目标)。

    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和回复消息放在一个类中,以实现更好,更清洁的管理。然后,您甚至可以将此对象与密钥一起放入字典中,您可以使用该密钥一次处理多个请求(请记住,它们是同步的,并且会阻塞您的线程,直到设置了超时或等待句柄为止)。