在C ++中使异步调用异步

时间:2013-10-14 11:54:38

标签: java web-services asynchronous client-server

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

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

我对这个问题的初步看法是,在分离模式下创建一个单独的线程。向客户发送您的请求的回复。在线程中生成一个任务,该任务将继续在UI中报告进度。

然而,问题是,从长远来看,这是最好的方法吗?或者应该有一个基础工作来获得async-nirvana?

1 个答案:

答案 0 :(得分:0)

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

编辑:

抱歉,错过了服务器使用的是C ++。

澄清......

在客户端,你有两个线程。 GUI和交互的主要线程,以及在建立连接时生成的通信线程。这两个线程将使用观察者设计模式的某种变体进行通信,这意味着“回调”或实际观察者。这允许主线程继续而不冻结GUI。确保在通信线程调用时,以某种方式将调用分派给主线程。

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

这是同样的想法,真的。

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

至于如何在C ++中完成它,这不是一个容易回答的问题。像C#和Java这样的现代语言有一种定义明确的方法,但C ++在这方面是不可知的。没有“C ++”的答案,但会有一个“C ++ on Windows”的答案。不是Windows的人,我在这里真的无法帮助你。