2016-07-25 11 views
1

Wie kann ich den BitmapEncoder auf UWP finalisieren/schließen?UWP BitmapEncoder Datei schließen?

InMemoryRandomAccessStream imras = new InMemoryRandomAccessStream(); 
await [...] //Fill stream 
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(imras); 
[...] //Do something 
StorageFile sf = await ApplicationData.Current.LocalFolder.CreateFileAsync("123.jpg", CreationCollisionOption.ReplaceExisting); 
BitmapEncoder bmpEncoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, await sf.OpenAsync(FileAccessMode.ReadWrite)); 
[...] 
await bmpEncoder.FlushAsync(); 
imras.Dispose(); 

Jetzt, wenn ich versuche, auf die Datei zuzugreifen, erhalte ich eine System.UnauthorizedAccessException, ich habe die UWP App zu schließen, um diese Datei zugreifen ... Wie kann ich es in der Nähe?

+0

Wenn Sie deterministische Zerstörung benötigen, keine Sprache (C#) oder eine Plattform (.NET) verwenden, die nicht liefern kann. Eine 'using'-Anweisung in Verbindung mit dem' IDisposable'-Muster reicht nicht aus. Sie können (basierend darauf) einen Kludim implementieren oder die unnötige verwaltete Ebene löschen. – IInspectable

Antwort

0

Sie müssen jedes IDisposable-Objekt entsorgen. Der einfachste Weg ist, das Schlüsselwort using zu verwenden.

using (var stream = await storageFile.OpenAsync()) // Or any other method that will open a stream. 
{ 
    var bitmapDecoder = await BitmapDecoder.CreateAsync(stream); 

    using (var randomAccessStream = new InMemoryRandomAccessStream()) 
    { 
     var bitmapEncoder = await BitmapEncoder.CreateForTranscodingAsync(randomAccessStream, bitmapDecoder); 

     // Do stuff. 

     await bitmapEncoder.FlushAsync(); 

     var buffer = new byte[randomAccessStream.Size]; 

     await randomAccessStream.AsStream().ReadAsync(buffer, 0, buffer.Length); 

     var someNewFile = await ApplicationData.Current.LocalFolder.CreateFileAsync("SomeFileName", CreationCollisionOption.ReplaceExisting); 

     await FileIO.WriteBytesAsync(someNewFile, buffer); 
    } 
}