Consumo de memória do controle BitmapImage / Image no Windows Phone 8

Eu estou testando um aplicativo WP8 e é visualizador de imagens para mostrar muitas imagens, achei o consumo de memória do aplicativo está aumentando e quer descobrir como resolvê-lo.

Eu li alguns artigos da web, no entanto, as soluções fornecidas por esses artigos não estão funcionando no meu aplicativo, por favor, leia o histórico abaixo.

Primeiro, encontrei o artigo "Dicas de imagem para o Windows Phone 7"e baixar sua amostra para fazer o teste de cache de imagem limpa, está trabalhando com1 imagem.

E então, para fins de teste, eu faço este aplicativo compilado com15 imagens offline dentro do aplicativo e definido como "Conteúdo", faça o download do aplicativo de testeAqui.

Minhas etapas de teste são:

(1) Launch app
(2) Go to Image Caching page
(3) Enable checkbox "Avoid Image Caching"
(4) Continuously tapping button Show/Clear
(5) Keep watching the memory status textblock at the bottom

Quando estou testando meu aplicativo, a memória está aumentando, como16,02MB => Mostrar (19.32MB) => Limpar (16.15MB) => Mostrar (20.18MB) => Limpar (17,03MB) ... etc E a memória não será liberada, mesmo deixando a página de cache e vá para a página de cache novamente. Parece a solução do artigo "Dicas de imagem para o Windows Phone 7"está trabalhando apenas1 imagem.

Aí vem o xaml e code-behind da solução por "Dicas de imagem para o Windows Phone 7".

[Caching.xaml]

        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <StackPanel Orientation="Horizontal" VerticalAlignment="Top">
                <ToggleButton Content="Show" Width="150" Checked="ShowImageClicked" Unchecked="ClearImageClicked"/>
                <CheckBox x:Name="cbAvoidCache" Content="Avoid Image Caching"/>
            </StackPanel>
            <Image x:Name="img" Grid.Row="2" Width="256" Height="192"/>
            <TextBlock x:Name="tbMemory" Grid.Row="2" Text="Memory: " VerticalAlignment="Bottom" Style="{StaticResource PhoneTextLargeStyle}"/>
        </Grid>

[Caching.xaml.cs]

public partial class Caching : PhoneApplicationPage
{
    public Caching()
    {
        InitializeComponent();

        DispatcherTimer timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromMilliseconds(500);
        timer.Start();
        timer.Tick += delegate
        {
            GC.Collect();
            tbMemory.Text = string.Format("Memory: {0} bytes", DeviceExtendedProperties.GetValue("ApplicationCurrentMemoryUsage"));
        };
    }

    private int nIndex = 1;
    BitmapImage bitmapImageFromUri = new BitmapImage();
    private void ShowImageClicked(object sender, RoutedEventArgs e)
    {
        string strImage = string.Format("../ImagesAsContent/{0:D2}.jpg", nIndex);
        bitmapImageFromUri.UriSource = new Uri(strImage, UriKind.Relative);
        img.Source = bitmapImageFromUri;

        nIndex++;
        if (nIndex > 15)
        {
            nIndex = 1;
        }

        (sender as ToggleButton).Content = "Clear";
    }

    private void ClearImageClicked(object sender, RoutedEventArgs e)
    {
        if (cbAvoidCache.IsChecked == true)
        {
            // set the UriSource to null in order to delete the image cache
            BitmapImage bitmapImageFromUri = img.Source as BitmapImage;
            bitmapImageFromUri.UriSource = null;
        }
        img.Source = null;
        (sender as ToggleButton).Content = "Show";
    }
}

Eu também tentei procurar outras soluções, alguns resultados de testes são como abaixo.

(1) Artigo "[wpdev] Vazamento de memória com o BitmapImage": Ele fornece duas soluções, uma é a API DisposeImage, outra é definir a origem BitmapImage como null. Além disso, o artigo nos informa que devemos ter cuidado com o manipulador de eventos attach / dettach, mas meu aplicativo de teste não tem manipulador de eventos na página de cache.

[DisposeImage]

private void DisposeImage(BitmapImage image)
{
    if (image != null)
    {
        try
        {
            using (var ms = new MemoryStream(new byte[] { 0x0 }))
            {
                image.SetSource(ms);
            }
        }
        catch (Exception)
        {
        }
    }
}

[Definir nulo]

BitmapImage bitmapImage = image.Source as BitmapImage;
bitmapImage.UriSource = null;
image.Source = null;

(2) Artigo "Windows phone: listbox com imagens sem memória": Ele fornece uma API" DisposeImage "com pouca diferença do que (1) como abaixo, mas isso também não funciona, eu ainda tenho o sintoma de aumento de memória.

public static void DisposeImage(BitmapImage image)
{
    Uri uri= new Uri("oneXone.png", UriKind.Relative);
    StreamResourceInfo sr=Application.GetResourceStream(uri);
    try
    {
     using (Stream stream=sr.Stream)
     {
      image.DecodePixelWidth=1; //This is essential!
      image.SetSource(stream);
     }
    }
    catch
    {}
}

(3) Artigo "Não é possível encontrar o vazamento de memória": Ele fornece as mesmas 2 soluções acima mencionadas, e também mencionou que o problema não pode ser reproduzido para imagens de armazenamento isoladas, no entanto as imagens do meu aplicativo de teste são de armazenamento isolado.

(4) Eu também tentei por 1000 imagens, o resultado do teste é app crash quando o aplicativo mostrou cerca de 190 imagens sequencialmente, por favor consulte o Windows Phone Application Analysis Graphics para a memória abaixo.

Finalmente, obrigado pela sua paciência para ler a minha pergunta e história, eu tenho trabalhado nisso para encontrar a solução por muitos dias. Se você tem alguma pista ou solução, por favor me avise.

Obrigado.

questionAnswers(1)

yourAnswerToTheQuestion