1秒ごとにネットワークソケットを介してMetroアプリで画像を受信し、それをバイト配列にロードしてから、BitmapImageに変換して後で表示しています。このすべてが正常に機能します。
向こう側のイメージは絶えず変化しています。何らかの理由で、OutOfMemory 例外が時々スローされます (10 分の 1 のように) 。画像を受信するたびにバイト配列をクリアすることで修正しました。今では魅力のように機能します。
私の主な問題については、以下を参照してください。
public static BitmapImage imag;
public static byte[] save = new byte[1];
if(recieved)
{
await reader.LoadAsync(4);
var sz = reader.ReadUInt32(); //read size
await reader.LoadAsync(sz); //read content
save = new byte[sz];
reader.ReadBytes(save);
await ImgSrcFromBytes(save)
Array.Clear(save, 0, save.Length); //issue here !!
}
public async Task<ImageSource> ImgSrcFromBytes(byte[] a)
{
imag = new BitmapImage();
var stream = new Windows.Storage.Streams.InMemoryRandomAccessStream();
await stream.WriteAsync(a.AsBuffer());
stream.Seek(0);
imag.SetSource(stream);
return imag;
}
現在、以下のコードを使用してユーザーから要求された場合に画像をファイルとして保存する新しい関数を実装していますが、上記のバイト配列をクリアすると、読み取り不能な画像が得られますが、クリアしないと配列、完璧な画像が得られます。
例外はスローされず、両方の画像が同じサイズであることに注意してください。
FileSavePicker picker = new FileSavePicker();
picker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
picker.SuggestedFileName = "capture.png";
picker.FileTypeChoices.Add("Png File", new List<string>() { ".png" });
StorageFile file = await picker.PickSaveFileAsync();
if (file != null)
{
CachedFileManager.DeferUpdates(file);
await FileIO.WriteBytesAsync(file, save);
await CachedFileManager.CompleteUpdatesAsync(file);
await new Windows.UI.Popups.MessageDialog("Image Saved Successfully !").ShowAsync();
}
私がはっきりしていることを願っています。これはトレードオフです。アレイをクリアすると、ソケットを介してストリームを受信しているときに例外は発生しませんが、保存時に読み取り可能な画像を取得できません。およびその逆。