【问题标题】:C# blocking wait for response, againC# 再次阻塞等待响应
【发布时间】:2013-10-09 00:56:10
【问题描述】:

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,另一种在同一台计算机上,一种形式到另一种形式?

感谢您容忍我的无知。

【问题讨论】:

  • 有关 TCP、序列化、SOAP 等的教程对您有帮助吗?如果是,这对 Stack Overflow 来说不是一个好问题。阅读综合教程会更好地为您服务。
  • 我想他们不会。我过去曾编写过这种代码,但当前的开发模型要简单得多,但我并不熟悉。我认为其他人可能也是如此,他们可以使用一个简单的例子。给定一个基础,我可以从那里开始。在你提到的那些东西中,你会使用哪一个? (我将编辑我的问题以更清楚一点......)
  • 您的问题能否概括为“如何通过网络向不同的进程和/或机器发送请求并接收回复?”?您是否正在寻找有关如何务实地实现这一目标的指导?
  • 在寻找如何实现我的目标时,无论我的搜索词是什么,我发现如何做到这一点的内容很少,而使用的模式却很多。所以我接受了这个模式。但鉴于此,AFAIK 的方法与以往不同。我正在寻找:“鉴于 TAP 模式,等待的方法有什么作用?”如果他们和以前没有什么不同,那很好。但是直到最近——我读过的关于 async/await 的博客都没有基于发布的编译器,只有 beta 代码——他们没有提到它们是否是可等待的,因此我不清楚;大概也不对其他人。

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


【解决方案1】:

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 或任何其他自定义传输支持。

【讨论】:

  • 好的,到目前为止这是一个好的开始。所以你说我应该这样做:await byte[] response = Request(string url, byte[] command)? (这似乎不是 Async 方法。但它是?)
  • 异步与否似乎与您想要实现的目标无关。你是写new WebClient().DownloadString("http://example.org/") 还是await new WebClient().DownloadStringTaskAsync("http://example.org/") 取决于你的项目结构和你使用的技术。它们执行完全相同的操作:它们下载一个字符串(该代码是完整且可执行的,顺便说一句。它执行 HTTP 请求)。
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多