1

私は現在、Windows Mobile 6.1 (WP ではない) で動作するアプリケーションに取り組んでいます。リモート サーバーからのデータを 1 日に複数回同期するアプリケーションを作成しました。でもなんとなく、このデータは終わった後に「記憶」されているようです。タスク マネージャーは、アプリケーションの通常の起動時に約 3MB が使用されていることを示しており、同期を実行するたびに約 2MB ずつ増加します。何度かメモリ使用量の警告が表示され、デバイスをリセットするか、プログラムを再起動する必要があります。

私が探しているのは、一種のガベージ コレクターである、同期後にデータをクリアする方法です。(通常の) C# では Collect() を見つけましたが、これを C# モバイルで動作させることはできません。

以下は私のコードで、特定の時点で「Geheugentekort」(「メモリ不足」) というメッセージが表示されることを除いて、正しく動作しています。

おそらく for{} コードの後で、doc、root、XmlNodeList などの変数を空にする必要がありますが、問題はその方法です...

私のデバイス: Pidion BIP-5000 OS: 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
4

3 に答える 3

1

ループ後にノードリストを破棄すると役立つ場合があります

System.Xml.XmlNodeList tempNodelist = Your stuff;
                IDisposable disposeMe = tempNodelist as IDisposable;
                if (disposeMe != null)
                {
                   disposeMe.Dispose();
                }
于 2013-09-20T07:13:33.430 に答える
1

XmlNodeListはIDisposableを実装namen.Dispose()しているため、(他の XmlNodeList オブジェクトに対しても) を呼び出して、オブジェクトを強制的に破棄してクリーンアップすることができます。

于 2013-09-20T07:14:23.153 に答える
0

はい、間違いなくローカルで 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 以降には、コンパクトなフレームワーク ライブラリ用の新しいメモリ スロットがあるため、メイン プロセスのメモリ スロットは減りません: http://blogs.msdn.com/b/robtiffany/archive/2009/04/09/memmaker-for -the-net-compact-framework.aspx

さらにヘルプが必要な場合は、詳細/コードを提供する必要があります。

于 2013-09-21T05:37:18.537 に答える