2016-11-16 80 views
0

在我UWP應用程序。BitmapImage.UriSource鎖定本地文件

查看

var bitmap = new BitmapImage(); 
bitmap.UriSource = new Uri("ms-appdata:///local/image.jpg"); 

型號

private async UpdateImage() 
{ 
    // this line throws! 
    var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("image.jpg", CreationCollisionOption.ReplaceExisting); 
    ... 
} 

我怎樣才能阻止的BitmapImage抱死作爲其UriSource本地文件?

回答

0

它拋出UnauthorizedAccessException「訪問被拒絕」異常,因爲文件被查看的BitmapImage的鎖定。

如您所知,如果使用BitmapImage.UriSource屬性設置源爲BitmapImage,則文件的文件流將鎖定繁忙。爲了解決這個問題,我們可以通過我們自己的IRandomAccessStream來讀取文件流,在這種情況下,我們可以控制何時處理文件流來解鎖文件。更新代碼如下:

private async void btncreate_Click(object sender, RoutedEventArgs e) 
{ 
    var file = await ApplicationData.Current.LocalFolder.CreateFileAsync("image.jpg", CreationCollisionOption.ReplaceExisting); 
} 

private async void Page_Loaded(object sender, RoutedEventArgs e) 
{ 
    var bitmap = new BitmapImage(); 
    //bitmap.UriSource = new Uri("ms-appdata:///local/image.jpg"); 
    //imgshow.Source = bitmap; 
    StorageFile imagefile = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appdata:///local/image.jpg")); 
    using (IRandomAccessStream stream = await imagefile.OpenAsync(FileAccessMode.Read)) 
    { 
     bitmap.SetSource(stream); 
     imgshow.Source = bitmap; 
    } 
} 
0

試試這個:

var bitmap = new BitmapImage(); 
bitmap.BeginInit(); 
bitmap.CacheOption = BitmapCacheOption.OnLoad; 
bitmap.CreateOption = BitmapCreateOptions.IgnoreImageCache; 
bitmap.UriSource = new Uri("ms-appdata:///local/image.jpg");  
bitmap.EndInit(); 
+0

'bitmap.CacheOption'會這樣做,但據我所知UWP不支持它。 – Vitaly

+0

謝謝,但不幸的是UWP中缺少'CacheOption'屬性。 – Vitaly

+1

對不起,你是對的我沒有注意到它是UWP ..我認爲你應該在調用Model UpdateImage之前管理你的View的BitMapImage對象的「重置」,然後在查看更新的圖像中重新加載。 –

0

周圍的工作「Sunteen武 - MSFT」幾乎是正確的,因爲bitmap.SetSource是隱式異步,的SetSource結束前的數據流可能會配置。您需要使用顯式函數SetSourceAsync並等待它。

無論如何,這個解決方案使用了大量的內存。 URI解決方案有點內存友好(很想知道爲什麼)。

URI解決方案將鎖定文件以確定長時間無法確定。儘管其他解決方案不鎖定任何文件,但它會爲不合理的時間分配大量內存。

我可以分享我的解決方案: 我將原始文件複製到臨時文件夾,然後用相應的Uri打開它。但是這個文件不會被我刪除,這可能會消耗大量的磁盤空間。

有沒有人有類似的問題?其他方案?