Потребление памяти в BitmapImage / Image control в Windows Phone 8

Я тестирую приложение WP8 и его средство просмотра изображений, чтобы показать много изображений, я обнаружил, что потребление памяти приложения растет, и хочу выяснить, как его решить.

Я читал некоторые статьи из Интернета, однако решения, предоставленные этими статьями, не работают в моем приложении, пожалуйста, прочтите историю ниже.

Сначала я нашла статьюИзображение Советы для Windows Phone 7"и загрузите его образец, чтобы выполнить чистое тестирование кэша изображений, он работает с1 изображение.

А затем для целей тестирования я делаю это приложение скомпилированным с15 автономных изображений внутри приложения и выберите «Контент», пожалуйста, загрузите тестовое приложение сВот.

Мои шаги тестирования:

(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

Когда я тестирую свое приложение, память растет, как16.02MB => Показать (19.32MB) => Очистить (16.15MB) => Показать (20,18 МБ) => Очистить (17.03MB) ... и т. д. И память не будет освобождена, даже если она покинет страницу кэширования и снова перейдет на страницу кэширования. Кажется, решение статьи "Изображение Советы для Windows Phone 7"работает только для1 изображение.

Здесь идет xaml и код позади решения "Изображение Советы для 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";
    }
}

Я также пытался искать любые другие решения, некоторые результаты тестирования, как показано ниже.

(1) статья "[wpdev] Утечка памяти с помощью BitmapImage": Он предоставляет 2 решения, одно - это API DisposeImage, другое - установить для источника BitmapImage значение NULL, как показано ниже. Также в статье дается нам знать, что мы должны быть осторожны с присоединением / извлечением обработчика событий, однако мое тестирующее приложение не имеет обработчика событий. на странице кеширования.

[DisposeImage]

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

[Установить ноль]

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

(2) статья "Windows phone: список с изображениями не хватает памяти": Он предоставляет API" DisposeImage "с небольшой разницей, чем (1), как показано ниже, но это также не работает, у меня все еще есть симптом повышения памяти.

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) статья "Не удается найти утечку памяти": Он предоставляет те же 2 решения, что и выше, также упоминается, что проблема не может быть воспроизведена для образов изолированного хранилища, однако образы моего приложения для тестирования взяты из изолированного хранилища.

(4) Я также пытался получить 1000 изображений, результатом тестирования является сбой приложения, когда приложение последовательно показывало около 190 изображений, см. Ниже таблицу памяти для анализа приложений Windows Phone.

Наконец, спасибо за ваше терпение, чтобы прочитать мой вопрос и историю, я работал над этим, чтобы найти решение в течение многих дней. Если у вас есть какие-либо подсказки или решения, пожалуйста, дайте мне знать.

Благодарю.

Ответы на вопрос(1)

Ваш ответ на вопрос