java - 在 C++ 中使同步调用异步

标签 java web-services asynchronous client-server

情况是这样的。客户端采用java开发,服务器采用C++(Windows平台)开发。通信通过请求和响应方式的服务调用进行。但调用是同步的。客户端发出请求调用,服务器处理请求并发送响应。直到那时客户端被阻止。

提供了可用于在客户端 UI 中报告进度的任务。这消除了客户端等待服务器响应的需要。

我对这个问题的最初看法是,在分离模式下创建一个单独的线程。向客户发送您的请求已被接受的响应。在线程中生成一个任务,该任务将不断在 UI 中报告进度。

问题是,从长远来看,这是最好的方法吗?或者应该有一个基础工作来实现异步涅槃?

最佳答案

现在的常见模式似乎是在单独的线程中运行阻塞 IO,然后使用在主线程上运行的回调/观察器。这种模式与在主线程上运行所有 GUI 工作的现代最佳实践很好地结合在一起。

编辑:

抱歉,忘记了服务器是用 C++ 编写的。

为了澄清...

在客户端,您有两个线程。用于 GUI 和交互的主线程,以及建立连接时生成的通信线程。这两个线程将使用观察者设计模式的某种变体进行通信,这意味着“回调”或实际的观察者。这允许主线程继续运行而不会卡住 GUI。确保当通信线程调用时,该调用以某种方式分派(dispatch)到主线程。

在服务器端,您通常会有相同模式的一些变体。将有一个主线程监听连接,然后为创建的每个连接生成一个线程(或进程)。只要 session 存在,通信线程就会处于 Activity 状态。这允许通信线程执行阻塞调用,而不会阻止主线程接受新连接。

确实是同样的想法。

有很多变体,特别是对于服务器端。重点通常是节省资源并避免重复工作,因此您希望限制允许的线程数量,并且您可能希望重新使用它们(“线程池”)。

至于到底如何在 C++ 中做到这一点,这不是一个容易回答的问题。 C# 和 Java 等现代语言有明确定义的方法来执行此操作,但 C++ 在这方面是不可知的。没有“C++”答案,但会有“Windows 上的 C++”答案。由于我不是 Windows 用户,所以我无法真正帮助您。

关于java - 在 C++ 中使同步调用异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19359670/

相关文章:

web-services - 如何托管 Restful WCF Web 服务

javascript - Typescript中异步函数的返回值

java - 有没有办法在原始条件为假之前跳出 while 循环?

java - Ubuntu 中的 Tomcat 和 IntelliJ

java - 如何在两个测试类之间共享ExternalResource?

ruby-on-rails - 在 Ruby on Rails 3 应用程序中开始使用 Web 服务

java - 通过 css 类名 javafx 添加事件

PHP7 cURL 和 SOAP 请求 SSL 失败

C# 异步并等待不等待代码完成

java - 将 Spring @Async 放置在方法调用堆栈中的位置