C#阻塞等待响应,再次

时间:2013-10-08 15:45:15

标签: .net multithreading events blocking c#-5.0

This question询问如何沟通查询并接收回复。我也想发送行动和信息请求。其中一些请求将采用参数,大多数不会。回复中,几乎所有人都会发回“OK”,但其他人会向我发送信息。除了这个命令协议之外,链路的两端对彼此一无所知。 OP得到了答案,告诉他如何包装他的代码。

我对这些回复感到不知所措,告诉我使用什么技术,如何包装代码等等;由于我正在用最新的工具进行全新的开发,我发现并接受了我想要使用TAP,因为Jon Skeet回答了OP的那个问题。我想我现在知道如何包装我的代码了。但是,我的问题不是使用什么技术,而不是如何使用async / await。

但这段代码是什么样的?使用哪些方法/参数等来发送查询并获得答案?如何建立彼此无法找到的两端之间的通信?如何包含参数?等

我想使用策略模式,以便在一种情况下,两端是表单,命令是按钮推送的结果,文本框的参数。那种形式存在。而尚未编写的第二个策略是两端通过网络在计算机之间进行通信。服务器将是Windows服务,命令模块将发送命令以响应生产线自动化。

我无法说“使用RPC”或“使用套接字”。什么是RPC?套接字代码如何与发送命令的部分相关...代码是什么样的?

说我有:

    public async void SendCommandAsync(Command c, Parameters p)
    {
        string response;
        await response = SendAsync(c, p);
    }

调用此函数之前需要做什么?什么是SendAsync()?它如何与远程监听器通信?两种策略之间存在什么并行性,其中一种策略通过网络与SOAP或HTTP通信,另一种策略在同一台计算机上,一种形式在另一种形式上?

感谢你忍住我的无知。

1 个答案:

答案 0 :(得分:0)

HTTP协议似乎是您正在寻找的。它通过TCP与远程主机执行单个请求/响应对。个人请求和相应的回复是独立的。 HTTP本质上为您提供了以下形式的函数:

byte[] response = Request(string remoteUrl, byte[] request);

此功能内的所有内容均由库自动完成。服务器也是如此。

如果要使用结构化数据(对象树)进行通信,则应该使用Web服务(可能基于SOAP)。它们是HTTP上的一个层,允许您发送/接收对象而不是字节数组。

关于策略模式:您可以将模式放在不同的层中。

  • 如果您愿意假设TCP(也适用于localhost环回),您只需要更改远程端点ip和端口
  • 如果您不愿意采用TCP,则可以假设存在双向Stream来交换消息。 HTTP可以在任何流上工作。在localhost连接上,您可以使用命名管道。在进程中,您可以使用MemoryStream
  • 或者,通过假设object response = Request(object request);形式的函数存在,您完全抽象出所有传输方面。该功能可以通过SOAP-over-HTTP或任何其他自定义传输来支持。