我每 1 秒通过网络套接字在 Metro 应用程序上接收图像,将其加载到字节数组中,然后将其转换为 BitmapImage 并稍后显示。所有这些工作正常。
另一边的图像在不断变化。出于某种原因,它会不时抛出 OutOfMemory 异常(如 1 in 10)。我通过在每次接收到图像时清除字节数组来修复它。现在它就像魅力一样。
关于我的主要问题,请参见下文:
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();
}
我希望我很清楚。这是一个权衡,如果我清除数组,我在通过套接字接收流时不会出现异常,但在保存时我将无法获得可读的图像。反之亦然。