アプリの Suspending イベントで RenderTargetBitmap を保存しています。アプリを開いて、Visual Studio で [サスペンドとシャットダウン] をクリックすると、すべて問題ありません。しかし、最初にスタート画面に移動するか、別のアプリを開いてしばらく待つと、つまり、アプリがフォアグラウンドにない場合、RenderTargetBitmap.GetPixelsAsync() メソッドは、HResult 0x80004005 と「特定できないエラー」の説明でこの COMException をスローします。実際の使用では、ユーザーがアプリから別のアプリに切り替えたときに中断が発生することを考えると、このエラーはほとんど常に発生します。definetelly で保存している RenderTargetBitmap は、この時点では null ではありません。これは、確認しているためです。
また、開発中に、アプリから別のアプリに切り替えてから元に戻すと、アプリが中断されずにすぐに開いた場合でも、一部の画像がガベージ コレクションのように UI に表示されないことに気付きました。まだ参照されていることを考えると、これはかなり奇妙です。上記の問題に関連しているかどうかはわかりませんが、可能性のようです。
誰かが同様の問題を経験しましたか? アプリが画面から消えたときに、これらの画像で正確に何が起こっているのでしょうか?
編集:
ここに例があります。Xaml:
<Grid x:Name="RootGrid" Background="AntiqueWhite">
<Rectangle Width="40" Height="50" Fill="Blue"/>
<Rectangle Width="70" Height="50" Fill="Red" Margin="100 300 0 0"/>
<Rectangle Width="30" Height="60" Fill="Green" Margin="0 0 150 70"/>
<Button x:Name="RenderButton" VerticalAlignment="Top" HorizontalAlignment="Center"
Margin="0 20 0 0" Content="Render" Click="RenderButton_OnClick"/>
</Grid>
コードビハインド:
private RenderTargetBitmap renderTargetBitmap;
public MainPage()
{
InitializeComponent();
Application.Current.Suspending += CurrentOnSuspending;
}
private async void RenderButton_OnClick(object sender, RoutedEventArgs args)
{
this.renderTargetBitmap = new RenderTargetBitmap();
await this.renderTargetBitmap.RenderAsync(RootGrid);
}
private async void CurrentOnSuspending(object sender, SuspendingEventArgs args)
{
var defferal = args.SuspendingOperation.GetDeferral();
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(
"render.png", CreationCollisionOption.ReplaceExisting);
await SaveToFileAsync(this.renderTargetBitmap, file);
defferal.Complete();
}
private async Task SaveToFileAsync(RenderTargetBitmap image, IStorageFile file)
{
using (var stream = await file.OpenStreamForWriteAsync())
{
var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, stream.AsRandomAccessStream());
var pixels = await image.GetPixelsAsync();
encoder.SetPixelData(BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore,
(uint)image.PixelWidth, (uint)image.PixelHeight, 96, 96, pixels.ToArray());
await encoder.FlushAsync();
}
}
モバイルでアプリを起動し、「レンダリング」ボタンをクリックします。その後、[スタート] を押してアプリを画面から外し、しばらく (10 秒で十分です) 待ってから、Visual Studio の [デバッグの場所] バーにある [中断してシャットダウン] を押します。COMException を観察します。