2013-09-20 4 views
0

Я хочу, чтобы изображения отображались каждые 10 секунд. Для этого я буду использовать класс Timer, который будет работать следующий peices код:удаление StorageFile в окнах 8

async private void captureImage() 
    { 
     capturePreview.Source = captureManager; 
     await captureManager.StartPreviewAsync(); 

     ImageEncodingProperties imgFormat = ImageEncodingProperties.CreateJpeg(); 


     // create storage file in local app storage 
     StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(
      "TestPhoto.jpg", 
      CreationCollisionOption.GenerateUniqueName); 


     // take photo 
     await captureManager.CapturePhotoToStorageFileAsync(imgFormat, file); 

     // Get photo as a BitmapImage 
     BitmapImage bmpImage = new BitmapImage(new Uri(file.Path)); 

     // imagePreivew is a <Image> object defined in XAML 
     imagePreivew.Source = bmpImage; 


     await captureManager.StopPreviewAsync();  
     //send file to server 
     sendHttpReq(); 

     await file.DeleteAsync(StorageDeleteOption.PermanentDelete); 


    } 

В настоящее время я звоню выше функций по нажатию кнопки,

Я хочу удалить файл после переноса изображения, как я буду отправлять его на веб-сервер. Однако я не вижу, что imagePreivew обновляется при нажатии кнопки, тогда как, когда я не удаляю файл, я вижу, что imagePreivew меняется каждый раз, когда я нажимаю кнопку. Также я попытался с CreationCollisionOption.ReplaceExisting, но все равно столкнулся с такой же проблемой. Создание нового файла каждый раз, когда таймер выполняет задачу, лишит много памяти. Как удалить файл ???

ответ

0

Проблема заключается в том, что вы удаляете изображение перед его загрузкой (битмап загружается асинхронно).

Чтобы решить, что просто заменить,

// Get photo as a BitmapImage 
    BitmapImage bmpImage = new BitmapImage(new Uri(file.Path)); 

по

using (IRandomAccessStream fileStream = await file.OpenAsync(Windows.Storage.FileAccessMode.Read)) 
     { 
      BitmapImage bmpImage = new BitmapImage(); 
      await bmpImage.SetSourceAsync(fileStream); 
     } 

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

Также вы должны ожидать sendHttpReq();, потому что в противном случае изображение также будет удалено перед отправкой запроса на сервер.

Еще одна вещь, которую вы, возможно, захотите исправить, - возможно, может быть второй вызов captureImage, пока предыдущий захват не будет завершен. Чтобы исправить это, вы можете использовать флаг IsStillCapturing и просто вернуться, если он все еще захватывает или использует AsyncLock, чтобы одновременно предотвратить два CapturePhotoToStorageFileAsync.

+1

Одно предложение: поместите вторичные операции, такие как sendHttpReq и DeleteAsync, в другую функцию async, которую вы можете вызвать, но не ожидаете в captureImage. Таким образом, вы можете вернуться из captureImage и позволить другому материалу работать параллельно. –

+0

@ KraigBrockschmidt-MSFT На самом деле captureImage даже не возвращает задачу, поэтому она выполняется асинхронно, поэтому она будет «возвращаться», как только будет выполнено первое ожидание, так что это не имеет большого значения. –

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