C#Mobile - 内存警告(内存清除)

时间:2013-09-20 06:54:31

标签: c# windows-mobile windows-mobile-6.1

我目前正在开发一个在Windows Mobile 6.1(不是WP)上运行的应用程序。我构建了一个应用程序,它每天多次同步来自远程服务器的数据。但不知何故,看起来这些数据在完成后会被“记住”。任务管理器显示在应用程序的常规启动时使用大约3MB,每次运行同步时大约增加2MB。多次后,我收到内存使用警告,我必须重置设备或重新启动程序。

我正在寻找的是在同步后清除数据的一些方法,一种垃圾收集器。在(常规)C#中我发现了Collect(),但我无法在C#mobile中使用它。

下面是我的代码,它正常工作,除了在某个时刻我收到消息“Geheugentekort”(“内存不足”)。

可能在for {}代码之后,我必须清空doc,root和XmlNodeList之类的变量,但问题是如何......

我的设备:Pidion BIP-5000 操作系统:Windows Mobile 6.1

XmlDocument doc = new XmlDocument();
doc.Load(xmlUrl);
XmlElement root = doc.DocumentElement;

try
{
    totaal = Int32.Parse(doc.GetElementsByTagName("Totaal")[0].InnerText.ToString());

    // Create lists with values
    XmlNodeList namen = doc.GetElementsByTagName("naam");
    XmlNodeList ptypen = doc.GetElementsByTagName("ptype");
    XmlNodeList ids = doc.GetElementsByTagName("id");

    // Door het totaal heen itereren
    for (int i = 0; i < totaal; i++)
    {
        // Create variables of it
        int id = Int32.Parse(ids[i].InnerText.ToString());
        int ptype = Int32.Parse(ptypen[i].InnerText.ToString());
        string naam = namen[i].InnerText.ToString();

        // Check if ID exists
        int tot = this.tbl_klantTableAdapter.GetData(id).Count;
        if (tot == 0)
        {
            // New item, add
            this.tbl_klantTableAdapter.Insert(naam, ptype, id);
        }
        else
        {
            // Existing, update
            this.tbl_klantTableAdapter.Update(naam, ptype, id);
        }
    }
}
catch
{
    // Rest of code

3 个答案:

答案 0 :(得分:1)

在循环可能有用之后处理节点列表

System.Xml.XmlNodeList tempNodelist = Your stuff;
                IDisposable disposeMe = tempNodelist as IDisposable;
                if (disposeMe != null)
                {
                   disposeMe.Dispose();
                }

答案 1 :(得分:1)

XmlNodeList实现了IDisposable,因此您可以调用namen.Dispose()(也用于其他XmlNodeList对象)来强制丢弃和清除对象。

答案 2 :(得分:0)

是的,你肯定应该在本地使用XML东西并在使用XML之后进行处理。 xml的东西似乎是ocupie大内存块。

您应该使用nameX.Dispose()和nameX = null来释放用于这些临时xml对象的内存。

您可以使用GC.Collect()强制收集内存:http://blogs.msdn.com/b/stevenpr/archive/2004/07/26/197254.aspx

您也可以使用远程.Net性能查看器获取内存使用情况:http://blogs.msdn.com/b/stevenpr/archive/2006/04/17/577636.aspx

如果您的应用在调用同步任务之前消耗了大量内存,您可以考虑使用单独的同步过程创建新应用程序。将函数移动到库时,还可以为进程释放内存。 WM6.1及更高版本为紧凑的Framework库提供了一个新的内存插槽,因此不会降低主进程内存插槽:http://blogs.msdn.com/b/robtiffany/archive/2009/04/09/memmaker-for-the-net-compact-framework.aspx

如果您需要更多帮助,请提供更多详细信息/代码。