11

ここで奇妙な動作が発生しました。通常のデスクトップ (Win7 prof .)

問題を見つけようとして何度も失敗した後、そのうちの 1 つをモニターのすぐ横に置き、ANTs MemoryProfiler をインストールし、ターミナルと開発用 PC の両方でユーザー操作をシミュレートする 1 時間のテストを実行しました。

その結果、いくつかの奇妙な理由により、組み込みシステムが大量の WeakReference および EffectiveValueEntry[] オブジェクトを積み上げます。

ここにいくつかの写真があります:

開発(PC): ここに画像の説明を入力

ここに画像の説明を入力

そしてターミナル: ここに画像の説明を入力

クラス一覧を見てみると… ここに画像の説明を入力

誰かが以前にこのようなものを見たことがありますか?これに対する既知の解決策はありますか? どこで助けを得ることができますか?

(PSは.net4用に用意されたイメージでインストールされた端末)

PPS: 近い有権者向け: 質問は明確だと思います: どうすればこれを修正できますか。これが IT/OS の問題なのかプログラミングの問題なのかについて議論することもできますが、これをServer Faultに投稿すると、すぐにトピックから外れた結論になると思います...

更新: 問題の大部分を見つけることができました - しかし、それは少し C++ のように感じます: ICommand (RelayCommand-pattern) を (とりわけ) 提供する WPF-List に ViewModel のような Items クラスを使用します。ビューのViewModel-Propertyのゲッターでオンザフライで作成されたアイテムで、アプリケーション/GCがこれらの未使用のコマンドまたはCanExecuteChangedへのサブスクリプションを解放しなかったようです-メモリプロファイラーはそれらを「によって保持されている」と表示します弱参照」。これらの item-viewmodels を再利用するようにコードを変更し、Dispose で使用されているすべてのプロパティを Dispose/set を null に設定し、これもクリーンアップとして使用します。これに加えて、私は強制GC.Collectを30分ごとに使用します(ええ、知っています-決してすべきではありません-しかし、今まで他の解決策はありませんでした)。

これらの WeakReferences がデスクトップ マシン上にあるため、なぜ要求されないのか理解できません...

これについて何か考えはありますか?お願いします!

更新: まだこの問題を突き止めることはできませんが、奇妙な動作が見られます: PC-Anywhere を使用して、端末の 1 つで自分のソフトウェアの動作を観察すると、問題は解決します! 8時間走った後でも。ソフトウェアは正常に実行されます-メモリも解放されます(メイン画面に小さなメモリカウンターディスプレイを配置しました-端末に接続してメモリが不足しているとしましょう-数分待った後、メモリが再利用されます)

したがって、Devin(以下の1つの回答)は正しい方向に進んでいると思います-リモートコントロールソフトウェアの何かがファイナライザースレッドのブロックを解除するか、GCをブロックしているもの-シミュレートされたキーボード/マウスなど.

これについて何か考えはありますか?

4

2 に答える 2

5

タブレットでアプリを実行すると、(多少) 同様の問題が発生しました。デスクトップで実行するとメモリが再利用されますが、PC 入力パネルを使用するタブレットやその他のデバイスで実行すると再利用されません。問題は、ファイナライズ キューがスタックしていたことです。COM オブジェクト ファイナライザは、メッセージ ループを持たないメイン スレッドで何かを実行するのを待っていました。

解決策は、呼び出すのに十分な時間を見つけることでしたApplication.DoEvents()。断続的に呼び出されるメソッドがあり、10 回目の呼び出しごとに呼び出します。これがあなたが抱えている問題と同じかどうかはわかりませんが、おそらくいくつかの光を当てることができます.

編集:明確にする必要があります。一般的に、電話DoEvents()は悪い考えです。その場合、そのスレッドには UI がないため、またはこれらのイベントが干渉する可能性のある他のことが起こっていないため、機能します。

于 2012-05-01T22:32:27.743 に答える