我创建了一个小型类来异步调用WebService(Fire和Forget。我不需要结果)。
在Windows窗体应用程序中,XXXAsync()
方法可以正常工作。但是,在Web应用程序中,该过程将被锁定,直到XXXCompleted
事件触发为止。
我的问题是:我尝试创建一个Delegate并使用Begin / EndInvoke来调用XXXAsync()
方法。它工作正常,但是,w3wp进程似乎消耗了大量内存。 我正在正确调用EndInvoke方法。调用GC.Collect
没有释放任何内存。
我也试过从WebService调用BeginXXX和EndXXXX方法,并得到了相同的结果。
我的WebService是一个愚蠢的HelloWorld,有一个Thread.Sleep(10000)
。
如何解决这个问题?有没有其他方法可以异步调用Web服务来避免这些泄漏?
修改[添加以下代码]:
WebService代码:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service1 : WebService
{
[WebMethod]
[OneWay]
public string HelloWorld()
{
Thread.Sleep(10000);
return "Hello World ";
}
}
ClassLibrary :
public class HelloLibrary : IDisposable
{
private delegate void PerformWhatever();
public HelloLibrary(){}
public string Notify()
{
PerformWhatever p = new PerformWhatever(OnBeforeBegin);
p.BeginInvoke(EndInvokeHandler, p);
return "1";
}
private void OnBeforeBegin()
{
using (localhost.Service1 s = new localhost.Service1())
{
s.HelloWorldAsync();
}
}
private void EndInvokeHandler(IAsyncResult r)
{
var delegateInstance = r.AsyncState as PerformWhatever;
delegateInstance.EndInvoke(r);
}
public void Dispose(){}
}
而且,在我的 Web应用程序中,我打电话给:
using (HelloLibrary library = new HelloLibrary())
{
library.Notify();
}
答案 0 :(得分:0)
如果您不需要结果而您拥有Web服务,则应考虑通过将SoapDocumentMethodAttribute属性设置为true,通过OneWay在Web服务端实现fire and forget功能。
当XML Web服务方法具有 OneWay属性设置为true,即XML Web服务客户端不必 等待Web服务器完成 处理XML Web服务方法。 只要Web服务器有 反序列化SoapServerMessage, 但在调用XML Web之前 服务方法,服务器返回一个 HTTP 202状态代码。 HTTP 202 状态代码向客户端指示 Web服务器已启动 处理消息。