Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#应用程序(DataTable dispose)中保持内存清晰?_C#_Visual Studio 2012_Datatable_Garbage Collection_Dispose - Fatal编程技术网

如何在C#应用程序(DataTable dispose)中保持内存清晰?

如何在C#应用程序(DataTable dispose)中保持内存清晰?,c#,visual-studio-2012,datatable,garbage-collection,dispose,C#,Visual Studio 2012,Datatable,Garbage Collection,Dispose,处理数据表并清除C#应用程序中所有相关RAM内存的最佳方法是什么 我有一个简单的代码: private void Form1_Load(object sender, EventArgs e) { using (DataTable vDT = new DataTable()) using (DataTable vDTsec = new DataTable()) { vDT.Columns.Add("A"); vDT.Columns.Add("

处理数据表并清除C#应用程序中所有相关RAM内存的最佳方法是什么

我有一个简单的代码:

private void Form1_Load(object sender, EventArgs e)
{
    using (DataTable vDT = new DataTable())
    using (DataTable vDTsec = new DataTable())
    {
        vDT.Columns.Add("A");
        vDT.Columns.Add("B");
        vDT.Columns.Add("B_1");

        vDTsec.Columns.Add("A");
        vDTsec.Columns.Add("B");
        vDTsec.Columns.Add("E");

        for (int x = 1; x <= 1000000; x++)
        {
            vDT.Rows.Add(new object[] { x, "B" + x.ToString(), "C" + x.ToString() });
            vDTsec.Rows.Add(new object[] { x, "B" + x.ToString(), "E" + x.ToString() });
        }

        vDT.Dispose();
        vDTsec.Dispose();
    }

    GC.Collect();
    GC.WaitForFullGCApproach(100);
    GC.WaitForPendingFinalizers();
}
private void Form1\u加载(对象发送方,事件参数e)
{
使用(DataTable vDT=newdatatable())
使用(DataTable vDTsec=newdatatable())
{
vDT.列。添加(“A”);
vDT.列。添加(“B”);
vDT.列。添加(“B_1”);
vDTsec.Columns.添加(“A”);
vDTsec.列。添加(“B”);
vDTsec.Columns.添加(“E”);

首先,对于(int x=1;x,您不必担心在任务管理器中看到的数字。这意味着垃圾收集器尚未收集内存(或者操作系统正在缓存内存),如果操作系统不需要,GC可能会等待一段时间来收集内存


更好地控制内存使用的唯一令人信服的理由(除了合理的对象管理之外)在您的应用程序中,是为了提高程序的性能特征。您这样做的方式是使用,这基本上意味着,您不需要销毁和重新创建对象,而是只创建一次对象,然后重新使用它们,因此GC永远不会收集。但是,只有在您用尽了所有其他提高性能的技术之后,才可以使用它。

您通常不应该自己调用垃圾收集。调用Dispose()并让GC完成它的工作。GC.Collect()尝试收集所有代。GC是或可能是昂贵的。大多数时候,它本身处理得很好,我们不需要直接参与


确保明确关闭和/或处置非托管对象(如DB连接)。如果要将这么多数据加载到内存中的数据表中,而您觉得有必要强制收集,您可能需要重新考虑您的方法。我很想了解您正在做的需要GC的事情。

您是否正在摆脱内存异常?否?然后继续。内存管理最好留给CLR。它知道何时执行分配和释放内存。内存分配非常昂贵,因此运行时将保留内存,如果可能的话不会将其释放回系统。关闭任务管理器。它不适合您。通常,只需将对象设置为
null
即可。如果涉及非托管资源,
IDisposable
使用
块比直接调用
Dispose()
要好。感谢您的解释;然后,最好的方法是避免创建包含大量数据的对象。我将尝试优化代码并重用现有资源。