我已经在这个主题上进行了很多搜索,但是我认为我没有使用正确的词来搜索这些东西,因为我还没有找到答案。
我正在寻找一种使流程等待外部源(特定)响应的方法。
更详细地讲,在标准套接字连接中,我通过socket.send向远程端点询问某个值,如何“捕获”他们的答复?我已经拥有的想法是发送某种标识符来确定它属于什么请求。
有没有一种方法可以有效地实现这一目标? (性能非常重要)。如果相关信息,我目前正在使用.NET2.0。
一些示例代码:
public void AskForReply()
{
//Send to connected endpoint
}
public void ReceiveReply(IAsyncResult response)
{
//Do stuff with the response
}
我一直在想出几个主意。但是他们都感到非常混乱,效率不高。是否有设计模式?有这种行为的标准吗?
非常感谢您的帮助!
答案 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和回复消息放在一个类中,以实现更好,更清洁的管理。然后,您甚至可以将此对象与密钥一起放入字典中,您可以使用该密钥一次处理多个请求(请记住,它们是同步的,并且会阻塞您的线程,直到设置了超时或等待句柄为止)。