2016-06-05 2 views
2

Мое приложение должно загружать одно и то же изображение определенное количество раз. Таким образом, мне нужно управлять использованием памяти, потому что после нескольких итераций у нее заканчивается память. Я пытаюсь использовать сборщик мусора, но он не работает. Я делаю это на своей странице содержания.Недостаточно памяти Загрузить картинку на Xamarin.Forms

Мой код выглядит следующим образом:

private async Task ExecuteTests(string imageResource) 
{ 

    // Do stuff 

    for (int q = 0; q < NUMBER_OF_TESTS; q++) { 

     // Do some work 

     await LoadImageAsync (imageResource); 

     // Do stuff 

     if (q < NUMBER_OF_TESTS - 1) { 
      stkImage.Children.Remove(mImageTested); 
      mImageTested = null; 
      GC.Collect(); 
     } 
    } 
} 

private async Task LoadImageAsync(string imageURI) 
{ 
    mImageTested = new Image { Aspect = Aspect.AspectFit }; 
    Task<ImageSource> result = Task<ImageSource>.Factory.StartNew(() => ImageSource.FromFile(imageURI)); 
    mImageTested.Source = await result; 
    stkImage.Children.Add(mImageTested); 
} 
+0

Я думаю, что вы сделали misstake в вашем примере. Он добавляет пару новых изображений в stkImage.Children, а затем удаляет последний. Остальные все еще присутствуют в stkImage. Дети, поэтому GC.Collect() не может их удалить. Мне также интересно, почему вам нужно сделать несколько изображений для одного и того же изображения? Не можете ли вы просто использовать ссылку на одно изображение несколько раз? Это спасет вашу память. –

+0

@ JaccoDieleman, он предназначен для выпускников. Я создаю своего рода бенчмарк. В этой части работы мне нужно загрузить изображение примерно в 50 раз и измерить среднее время его загрузки. Я мог бы сделать это вручную, например. запускать каждое исполнение и измерять его время, а затем вычислять среднее значение, но я хотел бы сделать это внутри цикла, если это возможно, конечно. Если я использую одну ссылку на изображение, моя мера не будет точной. Что я пытаюсь с этим кодом: - Добавить одно изображение - Если это не последнее исполнение, удалите его и вызовите GC.Collect() –

ответ

Смежные вопросы