我只是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;
}
}
答案 0 :(得分:9)
我怀疑Entities
是由Entity Framework生成并继承自DbContext
的类。如果是这样,请尝试使用using
阻止:
using(var entities = new Entities())
{
...
entities.SaveChanges();
}
请注意,对于每个请求,一般来说,它不是为DbContext
启动新实例的完美解决方案。有关详细信息,请参阅this很棒的答案。
答案 1 :(得分:0)
您可以尝试这样做:
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("");
}