2009-10-07 112 views
3

我有一个C#桌面应用程序,并且我没有任何问题地使用Web服务(通过添加服务引用添加了wsdl,因此我创建了一个对象并调用它的函数)。如何在C#中做一个长轮询客户端?

现在,我想使用长轮询技术,但我不知道如何从客户端的角度来做这件事。

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

感谢, 大坝的

回答

4

您应该能够配置Web服务对象的超时 - 细节将取决于正是它的使用哪一类,但看看WebClientProtocol.Timeout一个例。

现在你既可以同步调用,从一个专门的线程,或者你可以做一个异步调用Web服务入手,指定一个回调来执行(可能在一个线程池线程),当服务回复。在这种情况下,您可能会发现您可以在异步调用本身上指定超时时间 - 同样,它将完全取决于您获得的Web服务代理类的类型。

这样你就不需要“浪费”一个只等待响应的线程 - 但是你可能会发现异步编程模型比同步编程模型更难理解。如果您一次只有一个或两个这样的请求,那么额外的几个线程不太可能成为问题。如果您正在等待来自500个不同服务的响应,那么这是一个不同的问题,异步模式肯定会成为一种方式。

+0

谢谢您的回复。 我试过WebClientProtocol.Timeout,但我不知道该如何处理它。我的代码基本上是: ServiceReference1.TestSOAPImplClient test = new ServiceReference1.TestSOAPImplClient(); label1.Text = test.helloworld(); 并没有超时属性。我试图将它添加到生成的reference.cs中,但没有结果。 我认为这是一个基本的步骤中缺少的地方:) (顺便说一句,远程Web服务在Java的制造) 对于线程问题,我只会有2个或3个长轮询要求最高,所以我会去同步现在用线程。 – 2009-10-07 12:24:09

+0

TestSOAPImplClient派生自哪一类? – 2009-10-07 12:31:28

+0

在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 。 TestSOAPImpl是一个接口并且从无到有。所有这些都是自动生成的,也许这不是使用网络服务的最佳方式...... :) – 2009-10-07 12:50:39

1

对于线程问题,请参阅Jon的答案。

对于超时问题,下面是解决方案: 在vs 2008中,当我从wsdl添加“服务引用”时,默认情况下会使用WCF,并且我无法找到如何设置超时值它。

所以,当右键单击服务引用时,我必须选择“网站引用”(高级/添加Web引用)。这样,它将只使用“普通”Web服务,并且Timeout参数可用。