【问题标题】:Unmanaged Leak in Calling Web service in C#在 C# 中调用 Web 服务中的非托管泄漏
【发布时间】:2023-03-07 12:10:01
【问题描述】:

我的代码需要帮助。

我一直在尝试使用 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
    }
}

我似乎在这段代码中找不到任何错误。有人可以帮我解决我的非托管代码泄漏的问题吗?或者有人可以建议使用什么工具,甚至建议找到我的代码的泄漏部分?任何帮助都会很棒。

【问题讨论】:

  • 客户端是如何创建的?如果使用 svcutil,我想你可能也得打电话给client.Close()
  • @leppie 客户端正在处理,为什么我们需要显式关闭,主要是处理完成工作,关闭需要做什么
  • @MrinalKamboj:我确认了,你是对的,我错了。 IIRC,我认为我遇到的问题是尝试在不处理的情况下重用客户端进行后续请求。

标签: c# winforms web-services memory-leaks unmanaged


【解决方案1】:

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

具有非托管资源的标准 .net 托管对象(即:WebService.SoapClient)已经实现了终结器(析构函数),以便在不调用 Dispose 的任何情况下摆脱其非托管资源。如果您使用具有非托管资源的标准 .net 托管对象并且不调用 dispose(这很糟糕),它仍然会在完成最终确定时释放非托管资源。通常这不会导致非托管资源内存泄漏。

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

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

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

此外,请确保您已正确实现 IDisposable 并处置所有一次性对象并取消订阅所有事件订阅。

看看下面的演练

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    相关资源
    最近更新 更多