c#中调用Web服务的非托管泄漏

本文关键字:泄漏 服务 调用 Web | 更新日期: 2023-09-27 18:02:47

我需要帮助我的代码。

我一直在尝试使用RedGate来监控我的应用程序的内存使用情况,经过几个小时的测试,它指出了我的应用程序的非托管代码,我只能认为我的web服务调用是我的代码中唯一或有些非托管的部分。我调试了几个小时,似乎找不到哪里或什么真正发生了。下面是我的代码。

private void btnstart_Click(object sender, EventArgs e)
{
    btnPressed = !btnPressed //boolean
    if(btnPressed)
    {
        myTask = Task.Factory.StartNew(() => 
        {
            do {
                _checkMatches(token.Token);
            } while (token.IsCancellationRequested != true);
        },token.Token);
    }
    else
    {
        token.Cancel();
        try {
            Task.WaitAny(myTask);
        }
        catch(Exception Error) {
            //Put to logs
        }
        finally
        {
            if(myTask.isCancelled || myTask.IsCompleted || myTask.IsFaulted)
            {
                myTask.Dispose();
            } 
        }
    }
}
private void _checkMatches(CancellationToken token) 
{
    try
    {
        if(token.IsCancellationRequested)
        {
            token.ThrowIfCancellationRequested();
        }
        EndpointAddressBuilder ServiceEndPoint = new EndpointAddressBuilder(//Read Endpoint From Notepad);
        ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(delegate { return true; });//just bypassing validation for test purposes
        // WebService is an ASMX web service
        using (WebService.SoapClient client = new WebService.SoapClient()) 
        {
            WebService.checkResponse clientRes = client.checkClient();
            if(clientRes.response == 1 || clientRes.response == 2) {
                //Put to Logs
            }
        }
    }
    catch(Exception error){
        //Put to logs
    }
}
在这段代码中我似乎找不到任何错误。有人可以帮助我的问题是什么,为什么我的非托管代码正在泄漏?或者有人可以建议使用什么工具,甚至建议找到我的代码的泄漏部分?

c#中调用Web服务的非托管泄漏

如果你正在使用RedGate内存分析器,它应该告诉你的不仅仅是指向非托管资源。因为您没有直接创建任何未修改的资源,所以内存泄漏很可能是由托管对象或事件订阅(或回调订阅)引起的。

具有非托管资源的标准。net管理对象(即:WebService.SoapClient)已经实现了终结器(析构器),以便在任何情况下,如果Dispose未被调用,都可以摆脱其非托管资源。如果你使用一个标准的。net托管对象,它有非托管的资源,并且不调用dispose(这是不好的),它仍然会在结束时释放未受管理的资源。一般来说,这不会导致非托管资源内存泄漏。

如何检查是否有内存泄漏:

执行内存消耗逻辑几次。转到Instance列表,查看是否有正在增长的实例。选择"Objects with Source"选项,以摆脱成堆的系统对象。如果存在任何内存泄漏,您应该看到更多的实例。

如果有任何增长的实例,选择一个并查看对象保留图,该图将显示哪个实例持有引用。

并且,确保您已经正确地实现了IDisposable,并处理所有一次性对象,并取消订阅所有事件订阅。

请看下面的演练

http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/walkthrough http://www.red-gate.com/products/dotnet-development/ants-memory-profiler/