C#Web服务调用有时永远不会超时

C#Web服务调用有时永远不会超时,c#,web-services,windows-mobile,compact-framework,windows-ce,C#,Web Services,Windows Mobile,Compact Framework,Windows Ce,我有一个使用.net CF 3.5为windows mobile和windows ce应用程序编写的应用程序。它使用SOAP Web服务从服务器下载数据并将数据上载到服务器。我们使用自动生成的web引用来调用服务 通常,如果无法从服务器获得响应,对webservice的调用将超时,但有时对webservice的调用将永远不会超时,并将无限期挂起。我可以通过模拟50%的数据包丢失来合理地经常发生这种情况 为了解决这个问题,我创建了一个单独的线程来运行调用,并在4分钟后中止该线程。我无法对web引用

我有一个使用.net CF 3.5为windows mobile和windows ce应用程序编写的应用程序。它使用SOAP Web服务从服务器下载数据并将数据上载到服务器。我们使用自动生成的web引用来调用服务

通常,如果无法从服务器获得响应,对webservice的调用将超时,但有时对webservice的调用将永远不会超时,并将无限期挂起。我可以通过模拟50%的数据包丢失来合理地经常发生这种情况

为了解决这个问题,我创建了一个单独的线程来运行调用,并在4分钟后中止该线程。我无法对web引用对象调用abort(),因为这也将无限期挂起。这解决了眼前的问题,但是,每次我这样做,它会泄漏内存,如果我检查进程中的线程,它将有两个以上的线程每次。最终应用程序将耗尽所有系统内存并崩溃

我可以告诉您,web引用所使用的HttpWebRequest使用它自己的线程池来运行请求,每次其中一个请求挂起时,它都会创建另外两个线程来运行新的请求

我已经在运行不同版本Windows Mobile和Windows CE的许多摩托罗拉和Intermec设备上测试了这一点,并且在所有这些设备上都存在相同的问题


有人知道如何防止webservice调用无限期挂起吗?

您的通信层中是否有静态成员,这些成员可能会继续工作,并且无法停止……您是否在使用完请求和响应对象后关闭它们?使用语句将HttpWebRequest和HttpWebResponse放在C#
中会更好。我们使用的是Visual Studio自动生成的web引用。VisualStudio创建一个继承自SoapHttpClientProtocol的服务代理对象,因此我们不在自己的代码中处理HttpWebRequest,它由SoapHttpClientProtocol类处理。服务代理对象被包装在using语句中。为了确保,您确实在从
SoapHttpClientProtocol
继承的生成类上设置了
Timeout
属性?您的通信层中是否有静态成员,某些可能继续工作且无法停止的内容…在使用完请求和响应对象后,是否关闭它们?使用
语句将HttpWebRequest和HttpWebResponse放在C#
中会更好。我们使用的是Visual Studio自动生成的web引用。VisualStudio创建一个继承自SoapHttpClientProtocol的服务代理对象,因此我们不在自己的代码中处理HttpWebRequest,它由SoapHttpClientProtocol类处理。服务代理对象被包装在using语句中。为了确保,您确实在继承自
SoapHttpClientProtocol
的生成类上设置了
Timeout
属性?