2011-04-21 4 views
1

私たちは、レストラン用オートメーションソフトウェア(VS.NET C#を使用)を開発しています。そして、私たちはPOS製品を使用しています。POS製品には、その中に512 MBまたは1 GBのRAMを搭載したCeleronまたはAtomプロセッサが搭載されています。だから初めに私たちはもっと強力なPCを得ることができないことを知っている(私はあなたの顧客にもっと良いPCを手に入れるような提案を見た):))。My ProgramはEmptyWorkingSet関数でパフォーマンスを向上させますか?それは危険ですか?

メモリに問題があります。実際の顧客のカートを表すために、我々はパネルを使用し、カート内の製品を表すカスタムコントロールを追加する。これは、たくさんのコントロールがパネルに追加されてから、Panel.controls.Clear関数を削除することを意味します。このメソッドはメモリリークを引き起こし、プログラムのパフォーマンスが低下します。検索とグーグルの後、Panel.Control.Clear()関数はパネル内のすべてのコントロールをクリアしますが、メモリからは消去しませんでした。だから私はチェックパネルを無効にし、wholaaaすべてうまく動作します。もうメモリリークはありません。だから私は記憶を保存するためにそのカートパネルを削除することに決めました。しかし、後で私はEmptyWorkingSetのようなここで非常に有用な提案を見つけました。

[DllImport("psapi.dll")] 
    static extern int EmptyWorkingSet(IntPtr hwProc); 

    static void MinimizeFootprint() 
    { 
     EmptyWorkingSet(Process.GetCurrentProcess().Handle); 
    } 

次に、コードを追加してカートパネルを有効にし、何も変更しませんでした。パフォーマンスはまだ良好です。メモリリークはなく、パフォーマンスは低下しません。しかし、herehereにあるものがあります。EmptyWorkingSetはページフォルトを引き起こし危険です。私はテストプログラムだと何も起こらなかった。それは魅力のように働く。したがって、これらは私のオプションです

  1. メモリの問題を引き起こすカートパネルを取り外します。
  2. カスタムコントロールをcartPanelから削除した後、カスタムコントロールをメモリから削除します(私はわかりませんが、わかります)
  3. EmptyWorkingSetを使用しますが、ページフォルトが発生する可能性があります

は、あなたが、私は問題はあなたがそれらを配置する必要があるコントロールのコレクションを、クリアしているということだと思います

答えて

1

を何を言うSO)ページフォールトを意味していることです。また、イベントハンドラがオブジェクト間で参照を設定するので、イベントハンドラをクリアする前にコントロールにイベントハンドラをアンフックしていることも確認してください。そうすれば、イベントのリスナーはコレクションオブジェクトの適格性を保持します。私はワーキングセットを強制的にクリアしようとする前にそのルートに行きます。

+0

ここでは、イベントハンドラのフック解除についての素晴らしい記事があります。http://www.simple-talk.com/dotnet/.net-tools/tracing-memory-leaks-in-.net-applications-with-ants-profiler /。これは、カスタムコントロールやイベントのフック解除を行う方法です。しかし、あまりにも多くの努力、なぜEmptyWorkingSetを使用しないでコードの2行だけ。 – Murat

+0

@ Murat:IDisposableを実装するオブジェクトを処分する習慣を得るのがよい習慣です。この場合、あなたがやっていることはうまくいくかもしれませんが(と私はそれを疑っています)、将来的にはそうしないでしょう。 .NetのガーベッジコレクションとIDisposableがどのように動作するのかについては悩まないことが最善です。あなたがやっていることはハックであり、常に道を塞いで問題を引き起こします。 – Andy