C# Mobile - Память предупреждение (очистить память)

В настоящее время я работаю над приложением, которое работает на Windows Mobile 6.1 (не WP). Я создал приложение, которое синхронизирует данные с удаленного сервера несколько раз в день. Но как-то похоже, что эти данные "запоминаются" после окончания. Диспетчер задач показывает, что при обычном запуске приложения используется около 3 МБ, которое увеличивается примерно на 2 МБ при каждом запуске синхронизации. Через несколько раз я получаю предупреждение об использовании памяти, и мне приходится перезагружать устройство или перезапускать программу.

То, что я ищу, это какой-то способ очистки данных после синхронизации, своего рода сборщик мусора. В (обычном) 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 ответа

Решение

Утилизируйте свои нодлисты после того, как цикл может помочь

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

XmlNodeList реализует IDisposable, так что вы можете вызвать namen.Dispose() (также для других объектов XmlNodeList) для принудительного удаления объектов и их очистки.

Да, вам определенно следует использовать 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 и выше имеют новый слот памяти для компактных библиотек Framework, поэтому слот памяти основного процесса не уменьшается: http://blogs.msdn.com/b/robtiffany/archive/2009/04/09/memmaker-for-the-net-compact-framework.aspx

Если вам нужна дополнительная помощь, вы должны предоставить более подробную информацию / код.

Другие вопросы по тегам