Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A hatékony memóriakezelés segít az alkalmazásnak a teljesítményben, különösen a korlátozott erőforrásokkal rendelkező eszközökön. Ez a cikk az Windows App SDK asztali alkalmazások memóriakezelési stratégiáit ismerteti, különösen akkor, ha az alkalmazásablak nem látható.
Important
Az asztali alkalmazásokat a rendszer nem függeszti fel automatikusan . Futás közben továbbra is memóriát használnak fel. A proaktív memóriakezelés javítja a rendszer válaszkészségét és az akkumulátor élettartamát.
Memóriahasználat figyelése
Használja a Windows. System.MemoryManager osztály az alkalmazás memóriahasználatának és rendszerszintű memóriaállapotának ellenőrzéséhez:
ulong appMemoryUsage = Windows.System.MemoryManager.AppMemoryUsage;
ulong appMemoryLimit = Windows.System.MemoryManager.AppMemoryUsageLimit;
Windows.System.AppMemoryUsageLevel level = Windows.System.MemoryManager.AppMemoryUsageLevel;
System.Diagnostics.Debug.WriteLine(
$"Memory: {appMemoryUsage / 1024 / 1024} MB used, " +
$"limit: {appMemoryLimit / 1024 / 1024} MB, level: {level}");
Feliratkozhat a MemoryManager.AppMemoryUsageLimitChanging és a MemoryManager.AppMemoryUsageIncreased szolgáltatásra is, hogy reagáljon a memóriaterhelésre.
Memória csökkentése az ablak rejtett állapotában
Bár a rendszer nem függeszti fel az asztali alkalmazást, csökkentheti a memóriahasználatot, ha az ablak kis méretű vagy rejtett. Ez több erőforrást tesz elérhetővé az előtérben lévő alkalmazás számára, és megnöveli az akkumulátor élettartamát.
Észlelje, ha az ablak el van rejtve
Microsoft.UI.Xaml.Window nem tesz közzé eseményt VisibilityChanged . Ehelyett használja az eseményt Window.Activated annak észlelésére, hogy az ablak mikor veszíti el a fókuszt, vagy AppWindow.Changed észlelje, hogy mikor van minimalizálva:
var m_window = App_Window;
void ReduceMemoryUsage() { }
void RestoreResources() { }
m_window.Activated += (sender, args) =>
{
if (args.WindowActivationState == WindowActivationState.Deactivated)
{
// Window lost focus — consider reducing memory usage
ReduceMemoryUsage();
}
else
{
// Window is active — reload resources
RestoreResources();
}
};
// To specifically detect minimize, use AppWindow.Changed
var appWindow = m_window.AppWindow;
appWindow.Changed += (sender, args) =>
{
if (args.DidPresenterChange &&
sender.Presenter is OverlappedPresenter presenter &&
presenter.State == OverlappedPresenterState.Minimized)
{
// Window is minimized — reduce memory usage
ReduceMemoryUsage();
}
};
Mit kell kiadni?
Ha az ablak el van rejtve, fontolja meg a következők felszabadítását:
- Gyorsítótárazott képek és bitképek – Szabadítsa fel a csak megjelenítéshez szükséges nagyméretű bitképeket.
- Render-target erőforrások – A rendereléshez használt GPU-erőforrások felszabadítása.
- Nézetmodell adatai – A felhasználó visszatérésekor újra betölthető gyűjtemények vagy gyorsítótárazott adatok törlése.
- Navigációs előzmények – Ha az alkalmazás navigációs vermet tartalmaz, törölje a gyorsítótárazott oldalakat.
private System.Collections.Generic.List<object>? _imageCache;
private global::Microsoft.UI.Xaml.Window m_window = App_Window;
private void ReduceMemoryUsage()
{
// Release cached images
_imageCache?.Clear();
// Clear navigation cache
if (m_window.Content is Frame rootFrame)
{
rootFrame.CacheSize = 0;
}
// Hint the GC to collect if appropriate, without forcing a blocking collection.
// Only call this in response to system memory pressure, not on every hide.
GC.Collect(2, GCCollectionMode.Optimized, blocking: false);
}
private void RestoreResources()
{
// Restore navigation cache
if (m_window.Content is Frame rootFrame)
{
rootFrame.CacheSize = 10;
}
// Reload other resources as needed
}
Rendszermemória nyomásának kezelése
Regisztráljon a MemoryManager.AppMemoryUsageIncreased eseményre, hogy észlelje a rendszer memóriaterhelésének emelkedését:
void ReduceMemoryUsage() { }
Windows.System.MemoryManager.AppMemoryUsageIncreased += (sender, e) =>
{
var level = Windows.System.MemoryManager.AppMemoryUsageLevel;
if (level == Windows.System.AppMemoryUsageLevel.OverLimit ||
level == Windows.System.AppMemoryUsageLevel.High)
{
ReduceMemoryUsage();
}
};
Tip
Annak ellenére, hogy az asztali alkalmazásokat a rendszer nem állítja le automatikusan a memória felszabadítása érdekében (az UWP-alkalmazásokkal ellentétben), a memóriaigény csökkentése memórianyomás esetén segít megőrizni a rendszer válaszkészségét, és elkerülni a lehetséges memóriahiányos állapotokat.
Bevált gyakorlatok
- Szabadítsa fel, amit újra be tud tölteni. Csak a lemezről, hálózatról vagy számításból később rekonstruálható erőforrásokat szabadít fel.
- Csökkentse fokozatosan. Először adja ki a legnagyobb elemeket (képeket, gyorsítótárakat, adatgyűjtéseket).
- Alacsony memóriaigényű eszközökön tesztelje. Ellenőrizze, hogy a memóriakezelés működik-e 4 GB vagy kevesebb RAM-mal rendelkező eszközökön.
- Kerülje a nagy objektumok statikus mezőkben való tartását. Használjon inkább lusta betöltési mintákat.
Kapcsolódó tartalom
Windows developer