繁体   English   中英

c#中的内存泄漏从sql数据库读取数据

[英]memory leak in c# reading data from sql database

我只是c#的初学者,并接管了一个工作项目,其中包括由其他2位开发人员提供的代码。 从sql读取数据时代码存在内存泄漏。 基本上,代码从数据库中读取ping结果并将其返回到一个迷你图中,然后我将其显示在仪表板上。 希望你能帮忙。

[ActionName("get-response-times")]
    public JsonResult GetResponseTime()
    {
        try
        {
            //todo...get list of sites we we want to check from database
            var entities = new Entities();

            var sites = entities.Sites.ToList();

            var status = new List<ResponseDataModel>();

            foreach (var site in sites)
            {
                var response = Ping(site.URL);

                site.SiteResponseHistories.Add(new SiteResponseHistory
                {
                    CreateDate = DateTime.UtcNow,
                    ResponseTime = (int)response,
                    Site = site
                });

                status.Add(new ResponseDataModel
                {

                    ResponseTime = (int)response,
                    Name = site.Name,
                    ID = site.Id,
                    History = site.SiteResponseHistories.OrderByDescending(a => a.CreateDate).Select(a => a.ResponseTime.GetValueOrDefault(0)).Take(100).Reverse().ToArray()
                });
            }

            entities.SaveChanges();

            return Json(status);
        }
        catch (Exception)
        {
            // handle if necessary
        }

        return Json("");
    }

    protected long Ping(string url)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.Timeout = 3000;
            request.AllowAutoRedirect = false; // find out if this site is up and don't follow a redirector
            request.Method = "HEAD";

            Stopwatch watch = new Stopwatch();

            watch.Start();

            using (var response = request.GetResponse())
            {
                return watch.ElapsedMilliseconds;
            }
        }
        catch
        {
            return -1;
        }
    }

我怀疑Entities是一个由Entity Framework生成并继承自DbContext 如果是这样尝试using块:

using(var entities = new Entities())
{
    ...
    entities.SaveChanges();
}

请注意,一般来说,并不是为每个请求启动DbContext的新实例的完美解决方案。 有关详细信息,请参阅答案。

你可以尝试这样做:

    using (var context = new Context()) 
{     
    // Perform data access using the context 
}

和你的代码是这样的:

        [ActionName("get-response-times")]
    public JsonResult GetResponseTime()
    {
        try
        {
            var status = new List<ResponseDataModel>();
            //todo...get list of sites we we want to check from database
            using (var entities = new Entities())
            {
                var sites = entities.Sites.ToList();

                foreach (var site in sites)
                {
                    var response = Ping(site.URL);

                    site.SiteResponseHistories.Add(new SiteResponseHistory
                    {
                        CreateDate = DateTime.UtcNow,
                        ResponseTime = (int)response,
                        Site = site
                    });

                    status.Add(new ResponseDataModel
                    {

                        ResponseTime = (int)response,
                        Name = site.Name,
                        ID = site.Id,
                        History = site.SiteResponseHistories.OrderByDescending(a => a.CreateDate).Select(a => a.ResponseTime.GetValueOrDefault(0)).Take(100).Reverse().ToArray()
                    });
                }

                entities.SaveChanges();
            }
            return Json(status);
        }
        catch (Exception)
        {
            // handle if necessary
        }

        return Json("");
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM