我想每隔10秒捕捉一次图像。为此,我将使用Timer类,它将运行以下代码:
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);
}
目前我在按钮点击上调用上述功能,
我希望在传输图像后删除文件,因为我将其发送到Web服务器。但是,我没有看到imagePreivew按钮点击更新,而当我不删除文件时,我看到每次按下按钮时imagePreivew都会改变。我也尝试使用CreationCollisionOption.ReplaceExisting但仍面临同样的问题。每次定时器执行任务时创建新文件都会浪费大量内存。我该如何删除文件???
答案 0 :(得分:0)
问题是你在加载之前删除了图像(异步加载了Bitmap)。
要解决这个问题,只需要替换,
// 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。