异步ASP.NET中可能的内存泄漏调用WebService?

时间:2010-09-16 15:27:55

标签: .net asp.net memory-leaks asynchronous

我创建了一个小型类来异步调用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();
            }

1 个答案:

答案 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服务器已启动   处理消息。