好的,我要列出我软件的对象。目前,内存使用量随着时间的推移而增加,但它不应该增加,因为我没有保留任何资源。仅使用数据库。
c#4.0,visual studio 2010
让我们从对象开始。在这些对象上我应该调用dispose或使用“using”
string variable;
int variable;
dataset variable;
HtmlDocument variable;
List<string> variable;
HtmlNode variable;
Uri variable;
DateTime variable;
HtmlWeb variable;
Regex variable;
MatchCollection variable;
bool variable;
一段代码(File.WriteAllText?方法后需要的任何内容)
File.WriteAllText("hatalar/" + UtcTimeNow.Ticks.ToString() + GenerateRandomValue.GenerateRandomValueDefault(10000000) + ".txt", srCrawledUrl + " unknown error page id " + srPageId);
代码
if (irFinishedLast > -1)
{
var newTask = Task.Factory.StartNew(() =>
{
fcStartSubPageCrawl(srMainSiteURL, srMainSiteId, irWhichMainTask);
});
lock (lockerMainSitesArray)
{
if (MainSitesTaskList[irWhichMainTask, irFinishedLast] != null)
MainSitesTaskList[irWhichMainTask, irFinishedLast].Dispose();
MainSitesTaskList[irWhichMainTask, irFinishedLast] = newTask;
}
}
好了现在的课程和功能。公共静态函数,由许多线程同时调用。它在公共静态类中。
public static string srInserIntoPagesCommand = "insert into myTable (PageUrl,MainSiteId,CrawlDateInt,CrawlDateChar,CrawlDepth,ExtractedPageId,CrawlStatus) values " +
"(@PageUrl,@MainSiteId,@CrawlDateInt,@CrawlDateChar,@CrawlDepth,@ExtractedPageId,@CrawlStatus)";
public static bool InsertIntoPages(string PageUrl, string MainSiteId, string CrawlDateInt, string CrawlDateChar, string CrawlDepth, string ExtractedPageId, string CrawlStatus)
{
string srPageUrl = PageUrl;
string srMainSiteId = MainSiteId;
string srCrawlDateInt = CrawlDateInt;
string srCrawlDateChar = CrawlDateChar;
string srCrawlDepth = CrawlDepth;
string srExtractedPageId = ExtractedPageId;
string srCrawlStatus = CrawlStatus;
if (srCrawlDateInt.Length < 1)
srCrawlDateInt = "0";
if (srCrawlDateChar.Length < 1)
srCrawlDateChar = "null";
if (srCrawlStatus.Length < 1)
srCrawlStatus = "0";
using (SqlConnection connection = new SqlConnection(DbConnection.srConnectionString))
{
using (SqlCommand cmd = new SqlCommand(srInserIntoPagesCommand, connection))
{
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@PageUrl", srPageUrl);
cmd.Parameters.AddWithValue("@MainSiteId", srMainSiteId);
cmd.Parameters.AddWithValue("@CrawlDateInt", srCrawlDateInt);
cmd.Parameters.AddWithValue("@CrawlDateChar", srCrawlDateChar);
cmd.Parameters.AddWithValue("@CrawlDepth", srCrawlDepth);
cmd.Parameters.AddWithValue("@ExtractedPageId", srExtractedPageId);
cmd.Parameters.AddWithValue("@CrawlStatus", srCrawlStatus);
try
{
connection.Open();
cmd.ExecuteNonQuery();
}
catch (Exception E)
{
DateTime UtcTimeNow = DateTime.UtcNow;
File.WriteAllText("pageshatalar/" + UtcTimeNow.Ticks.ToString() + GenerateRandomValue.GenerateRandomValueDefault(1000000) + ".txt", "InsertIntoPages \r\n\r\n" + E.Message.ToString() + "\r\n\r\n" + srPageUrl);
return false;
}
}
connection.Close();
}
return true;
}
主要位于公共静态类
内的选择查询的公共静态数据库连接public static string srConnectionString = "server=localhost;database=mydb;uid=sa;pwd=mypw; Max Pool Size=20000; Pooling=True;";
public static DataSet db_Select_Query(string strQuery)
{
DataSet dSet = new DataSet();
try
{
using (SqlConnection connection = new SqlConnection(srConnectionString))
{
connection.Open();
using (SqlDataAdapter DA = new SqlDataAdapter(strQuery, connection))
{
DA.Fill(dSet);
}
connection.Close();
}
return dSet;
}
catch
{
DateTime UtcTimeNow = DateTime.UtcNow;
File.WriteAllText("sqlhatalar/" + UtcTimeNow.Ticks.ToString() + GenerateRandomValue.GenerateRandomValueDefault(1000000) + ".txt", strQuery);
return null;
}
}
答案 0 :(得分:2)
您不会随意调用处理任何特定的东西。 using
语句和.Dispose
方法适用于实现接口IDisposable
的对象
public interface IDisposable
{
void Dispose();
}
对顶部变量列表进行粗略检查表明这些变量都没有实现IDisposable
。您不能在这些上调用Dispose()
,也不能将它们包装在using
语句中。
此外,在实际的一次性对象上调用Dispose()
并不是一种内存管理形式,它旨在释放非托管资源。垃圾收集器未连接到此。如果您遇到内存管理问题,可能会发现您将太多对象保留太长时间。您需要探索范围和生命周期,集合大小等,因为这些将添加到您的垃圾中。
您的显示代码中没有显示您的内存问题,只是说您可能正在处理并返回大型数据集,而您的呼叫者可能会进一步保留超过必要的时间。或者它可能是与显示的任何代码完全无关的其他内容。如果您遇到内存问题,运行内存分析器以识别问题区域。为此,您可以免费试用Red Gate或JetBrains的分析器。
答案 1 :(得分:1)
您无法在列表中的大多数对象上调用Dispose()
,因为它们不会公开Dispose()
方法。您应该在实现Dispose()
接口的任何类型的对象上调用IDisposable
。就是这样。
答案 2 :(得分:1)
如果由于某些奇怪的原因,您在运行时不知道对象是否已实施处置,您可以使用此处置安全功能:
/// ---- IsDisposable --------------------------------
///
/// <summary>
/// returns true if an object is disposable, false if not
/// you can optionally dispose of it immediately
/// </summary>
public static Boolean IsDisposable(Object Item, Boolean DeleteIfDisposable)
{
if (Item is IDisposable)
{
if (DeleteIfDisposable)
{
IDisposable DisposableItem;
DisposableItem = (IDisposable)Item;
DisposableItem.Dispose();
}
return true;
}
else
return false;
}