c# - Eliminar proyectos/páginas/controles de usuario de la memoria
visual-studio windows-phone-8 (3)
He creado una aplicación de teléfono para Windows, que desafortunadamente tiene alguna pérdida de memoria, porque las páginas no se eliminan correctamente. Esto fue resuelto al usar la respuesta:
Eliminar páginas del teléfono de Windows indicando:
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
while (App.RootFrame.RemoveBackEntry() != null) ; //line if you navigate without backkey
base.OnNavigatedTo(e);
this.Dispatcher.BeginInvoke(() =>
{
GC.Collect();
GC.WaitForPendingFinalizers();
this.Dispatcher.BeginInvoke(() =>
{
GC.Collect();
GC.WaitForPendingFinalizers();
this.Dispatcher.BeginInvoke(() =>
{
GC.Collect();
GC.WaitForPendingFinalizers();
});
});
}
Esto eliminó las referencias de página del generador de perfiles. Pero la memoria aún aumentó un poco después de la navegación. Y no era obvio de dónde provenía el aumento de la memoria. Por lo tanto, probé presentando un proyecto en blanco y navegué hacia eso como una navegación en estrella, ilustrada como:
Esto eliminó más de 20 mb de elementos visuales y otros elementos. Entonces este fue un gran paso. Por lo tanto, quería dividir la funcionalidad en diferentes proyectos para eliminar cualquier vínculo entre las diferentes funcionalidades y mantener un bajo uso de memoria. Esto terminó con la siguiente estructura:
- Servicio web
- MainProject
- Proyecto Secundario
- PortableLibrary
Comparto modelos entre todos los proyectos usando la Biblioteca portátil. Esto influyó en que con cada navegación a un nuevo proyecto, todo se borra en el proyecto anterior, es decir, solo existe un elemento de cada elemento, una gran mejora en la memoria. Pero aún hay una fuga de memoria, aunque limitada, lo que significa solo un cierto aumento en la memoria. Pero, ¿de dónde viene el recuerdo? Volviendo al generador de perfiles:
Esto muestra que las páginas no se eliminan específicamente, todos los elementos .view. habría sido eliminado por el código en la configuración de todas las páginas en un proyecto. Sin embargo, la pérdida de memoria es similar.
La pregunta
- ¿Cómo elimino páginas y elementos de un proyecto diferente dentro de la misma solución?
- ¿Cómo elimino un proyecto de la memoria?
No hay información compartida entre los dos proyectos, aparte de que ambos pueden crear una versión de LibraryOfModels
. Por lo tanto, no se comparten eventos, variables o referencias entre los bordes del proyecto. Pero por mi vida no puedo borrarlo de la memoria. Quiero eliminarlos de la memoria, como lo hace mi fragmento de código en la parte superior, SI la navegación solo estaba dentro de un proyecto. El problema existe debido a que la navegación se extiende en dos proyectos. Pero tiene algunos beneficios de memoria en otras áreas, por lo que quiero esta estructura.
Espero que alguien pueda ayudar. ¡Gracias!
Exámenes adicionales
Intenté hacer todos los controles de usuario de las páginas para evitar la navegación. Pero al recrearlos un par de veces obtuve una fuga constante de 1-2 Mb. Por lo tanto, la idea del proyecto sigue siendo la mejor ya que hay un límite. Pero aún no hay solución para eliminarlo.
Todavía esperando al caballero con el teclado brillante;)
Creo que puede hacer que el objeto sea singleton y puede borrar los valores de los objetos manualmente cuando corresponda. Consulte el siguiente enlace https://msdn.microsoft.com/en-us/library/ff650316.aspx
Encuentre todos los gráficos desechables / IO, asegúrese de que los desechó (después de que haya terminado de usarlos).
Todos esos objetos que heredan de la interfaz IDispose.
Tenga cuidado con los controles / bibliotecas de terceros, Image, LongListSelector, FlipView o WebView, ya que tienen algunos problemas con la administración de la memoria.
Debe asegurarse de que ningún subproceso / tarea / temporizador haga referencia a sus Vistas / Modelos de Vista.
Hay dos artículos interesantes sobre pérdidas de memoria:
- Fugas de memoria en aplicaciones WPF
- Administrar la memoria en las aplicaciones de la tienda de Windows
Supongo que será difícil encontrar la causa raíz sin ningún proyecto de muestra. Si no ocurre en un proyecto vacío con la misma arquitectura, entonces hay algún problema en su código.