我们应该在什么对象上使用dispose方法?c# 4.0

本文关键字:方法 dispose 在什么 对象 我们 | 更新日期: 2023-09-27 18:11:55

好的,这里我要列出我的软件对象。当前内存使用量随着时间的推移而增加,尽管它不应该增加,因为我没有保留任何资源。仅使用数据库

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;
        }

公共静态数据库连接,主要用于公共静态类内的select查询

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;
    }
}

我们应该在什么对象上使用dispose方法?c# 4.0

您不能对任何特定的东西随机调用dispose。using语句和.Dispose方法用于实现接口IDisposable

的对象。
 public interface IDisposable
 {
       void Dispose();
 }

对顶部变量列表的粗略检查表明,这些变量都没有实现IDisposable。您不能对它们调用Dispose(),也不能将它们包装在using语句中。

此外,在实际的一次性对象上调用Dispose() 并不是要作为一种内存管理的形式,而是要释放未管理的资源。垃圾收集器没有连接到此。如果您在内存管理方面存在问题,则可能表明您让太多对象存活的时间过长。您需要探索作用域、生命周期、集合大小等,因为这些都将添加到您的垃圾中。

你的内存问题并没有在你显示的代码中显示出来,除了说你可能正在处理和返回大型数据集,你的调用者可能会进一步保持比必要的更长时间。或者它可能是与显示的任何代码完全无关的其他东西。如果您有内存问题,运行内存分析器来识别问题区域。为此,您可以从Red Gate或JetBrains获得分析器的免费试用。

如果由于某些奇怪的原因,您在运行时不知道对象是否实现了dispose,您可以使用这个dispose安全函数:

/// ---- 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;
}

您不能在列表中的大多数对象上调用Dispose(),因为它们不公开Dispose()方法。您应该在实现IDisposable接口的任何类型的对象上调用Dispose()。就是这样。