【问题标题】:C# Mobile - Memory warning (clear memory)C# Mobile - 内存警告(清除内存)
【发布时间】:2013-09-21 13:37:18
【问题描述】:

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

我正在寻找的是某种在同步后清除数据的方法,一种垃圾收集器。在(常规)C# 中,我找到了 Collect(),但我无法在 C# 移动设备中使用它。

下面是我的代码,它工作正常,除了在某个时刻我收到消息“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

【问题讨论】:

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


    【解决方案1】:

    在循环之后处理您的节点列表可能会有所帮助

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

    【讨论】:

    • 谢谢!这可行,但它似乎还没有帮助内存使用。我可能在代码中还有其他一些 MB 重的东西。
    • 也许将“doc”变量设置为 Private static 或其他东西而不是总是创建一个新文档也有帮助。你也可以设置 doc = null;如果每次都需要创建一个新文档,则在循环之后。我不知道,但我认为您仍然参考了避免其处置的“文档”(因此它保留在内存中)。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      是的,您绝对应该在本地使用 XML 内容并在使用 XML 内容后进行处理。 xml 的东西似乎占用了很大的内存块。

      您应该使用 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及更高版本为compact Framework库增加了新的内存槽,所以主进程内存槽没有降低:http://blogs.msdn.com/b/robtiffany/archive/2009/04/09/memmaker-for-the-net-compact-framework.aspx

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

      【讨论】:

        猜你喜欢
        • 2011-04-09
        • 2016-03-17
        • 2020-10-06
        • 1970-01-01
        • 2011-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多