在Windows 8中删除StorageFile

时间:2013-09-20 15:51:21

标签: c# windows-8 windows-runtime

我想每隔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但仍面临同样的问题。每次定时器执行任务时创建新文件都会浪费大量内存。我该如何删除文件???

1 个答案:

答案 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。