2017-01-29 9 views
0

UWP(XAML/C#)ではFrame.Navigate(typeof(Page2));を使用し、Page2のC#ではタイマを使用し、Frame.GoBack();を使用すると、フレームは実際に戻ってきますが、タイマーは停止しません。ページとそのすべてのコンポーネントがバックグラウンドで実行されていることを意味し、そのためにアプリはあまりにも多くのRAMを消費しています。どのように私はページを "殺す"ことができますか?ページのナビゲートとバックグラウンドでの実行

注:ユーザーが10回、このナビゲーションを使用している場合、ページはバックグラウンドで10倍であり、それは悪い..です

+0

あなたはどのようなタイマーを使用しないように診断ツール、上記のように助けにはならない、Visual Studioの中に含まれている場合、メモリリークを見つけるために、メモリプロファイラを使用することをお勧めでしょうか? – Yarik

+0

'Windows.UI.Xaml.DispatcherTimer'ですが、これはタイマーの問題ではありません(私はちょうど_timer.Tickでタイマーとブレークポイントのおかげで見つけましたが、問題はすべてのコンポーネントとすべてのページがまだバックグラウンドにあるということです) 。 – Peter

+1

ページから離れて移動すると、タイマーを明示的に停止することを忘れないでください。 'DispatcherTimer'は' Dispatcher'とあなたのページが実行されているときに強い参照を作成します。 – Yarik

答えて

1

CLRのガベージコレクタが殺害」のために責任があるものであることを理解することが重要です"未使用のオブジェクト。オブジェクト(およびそのメンバーすべて)は、参照されなくなったときに「未使用」になります。

Windows.UI.Xaml.DispatcherTimerを起動すると、現在のDispatcher内のタイマーコレクションに自身を追加し、Dispatcherとタイマーの間のダイレクトリファレンスを作成します。タイマーは、順番に、実行中のページへの参照を保持します。 Dispatcherはグローバルオブジェクトであるため、タイマーが停止するまでページをアクティブに保ちます。

含むメモリリークの他の原因(それはかなり広範なトピックである)、が存在することができます:あなたのページへの直接または間接参照の

  • 他の源。
  • 静的イベントのサブスクリプション。
  • {Binding Path=Property.Subproperty}のような複雑なデータバインディング。

私はあなたが2015年

関連する問題