如何在C#中实现长轮询客户端?

3

我有一个C#桌面应用程序,我使用“添加服务引用”添加了wsdl后没有问题地使用Web服务,所以我创建了一个对象并调用它的函数。

现在,我想使用长轮询技术,但我无法从客户端的角度解决这个问题。

如何配置超时时间? 我应该使用专用于此的线程吗? 是否有C#桌面应用程序的示例?(没有找到)

谢谢, Dam's

2个回答

4
您应该能够配置 Web 服务对象的超时时间 - 具体细节取决于它使用的类,但请参考 WebClientProtocol.Timeout 获取示例。
您可以从专用线程同步调用它,也可以首先对 Web 服务进行异步调用,在响应时指定要执行的回调(可能在线程池线程上)。在这种情况下,您可能会发现可以在异步调用本身上指定超时时间 - 再次取决于您拥有的 Web 服务代理类的具体类型。
这样,您就不需要“浪费”一个线程只等待响应 - 但是您可能会发现异步编程模型比同步模型更难理解。如果您一次只有一两个此类请求,则多出来的几个线程不太可能成为问题。如果您正在等待来自 500 个不同服务的响应,则情况就不同了,异步模型肯定是正确的方法。

谢谢您的回复。我已尝试使用WebClientProtocol.Timeout,但不知道如何处理。我的代码基本上是:ServiceReference1.TestSOAPImplClient test = new ServiceReference1.TestSOAPImplClient();label1.Text = test.helloworld();并且没有超时属性。我尝试在生成的reference.cs中添加它,但没有结果。 我认为某个基本步骤遗漏了 :) (顺便说一句,远程Web服务是用Java制作的)对于线程问题,最多只有2或3个长轮询请求,因此我现在会使用同步线程。 - Dam's
TestSOAPImplClient继承自哪个类? - Jon Skeet
在reference.cs文件中,我有以下代码: [System.Diagnostics.DebuggerStepThroughAttribute()] [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] public partial class TestSOAPImplClient : System.ServiceModel.ClientBase<WS_Client_Test1.ServiceReference1.TestSOAPImpl>, WS_Client_Test1.ServiceReference1.TestSOAPImpl TestSOAPImpl是一个接口,没有继承任何内容。所有这些都是自动生成的,也许这不是使用Web服务的最佳方式... :) - Dam's
嗯...我看不到任何超时,不。不幸的是,我对WCF不太了解... - Jon Skeet
好的,我会尝试重新启动项目,而不使用WCF(事实上,我不记得选择WCF了...) - Dam's

1

关于线程问题,请参考Jon的回答。

关于超时问题,这里有解决方案: 在vs 2008中,当我从wsdl添加“服务引用”时,默认使用WCF,我找不到如何设置超时值。

因此,在右键单击服务引用时,我必须选择“Web引用”(高级/添加Web引用)。这样,它将仅使用“普通”Web服务,并且Timeout参数可用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接