【问题标题】:Outofmemory when I'm loading image with thumbnailload当我使用缩略图加载加载图像时内存不足
【发布时间】:2021-05-02 06:31:09
【问题描述】:

当我尝试从我的文件夹中加载图像时,我得到一个: OutOfMemory

我在使用 MemoryStream 时遇到以下错误:

 public ImageSource ThumbnailLoadAsync()
        {
            var imageTemp = File.Exists(Image) ? Image : string.Format("{0}\\img\\unknow.png", ImageFolderRoot);

            MemoryStream ms = new MemoryStream(File.ReadAllBytes(imageTemp));
            ImageSourceConverter imageSourceConverter = new ImageSourceConverter();
            Thumbnail = (ImageSource)imageSourceConverter.ConvertFrom(ms);
            this.NotifyPropertyChanged("Thumbnail");
            return Thumbnail;
        }

然后,我看到了一个更好的 MemoryStream 版本,它是 RecyclableMemoryStreamManager,但我也遇到了同样的错误。也许我用错了。

这是我的代码:

 private RecyclableMemoryStreamManager _imageRecyclableMemoryStream;
        public ImageSource ThumbnailLoad()
        {
            var imageTemp = File.Exists(Image) ? Image : string.Format("{0}\\img\\unknow.png", ImageFolderRoot);
            _imageRecyclableMemoryStream = new RecyclableMemoryStreamManager();
            ImageSourceConverter imageSourceConverter = new ImageSourceConverter();
            Thumbnail = (ImageSource)imageSourceConverter.ConvertFrom((RecyclableMemoryStream)_imageRecyclableMemoryStream.GetStream(File.ReadAllBytes(imageTemp)));
            this.NotifyPropertyChanged("Thumbnail");
            return Thumbnail;
        }

【问题讨论】:

  • 在得到 OOM 之前,您调用了该方法多少次?
  • _imageRecyclableMemoryStream = new RecyclableMemoryStreamManager(); 我怀疑你只想要new 一次——而不是每次调用。
  • 你为什么首先使用MemoryStreamBitmapImage(new Uri(imageTemp)); 应该做我猜的工作吗?
  • 你为什么使用MemoryStream而不是传入FileStream或使用codeproject.com/Questions/235637/…
  • @OlivierRogier 这些重复项似乎与位图/图像有关,这不是 OP 需要的。

标签: c# image out-of-memory thumbnails


【解决方案1】:

我认为您只需要分配一次内存流并使用 using 块...类似于...

private static readonly RecyclableMemoryStreamManager recyclableMemoryStreamManager = new RecyclableMemoryStreamManager();

static void Main(string[] args)
{
    string data = "This is a sample text message.";
    var buffer = Encoding.ASCII.GetBytes(data);

    using (var memoryStream = recyclableMemoryStreamManager.GetStream())
    {
        memoryStream.Write(buffer, 0, buffer.Length);
    }
}

【讨论】:

  • OP根本不需要内存流。当然,您可以对其进行优化,但最好的解决方案是完全停止使用它
  • 最好的建议,是的。但是我们仍然不知道实际问题来自哪里..
猜你喜欢
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 2013-05-26
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-29
  • 2016-07-19
相关资源
最近更新 更多