gpt4 book ai didi

c# - BitmapImage:如何在返回图像之前等待 BitmapImage 初始化? (C#.NET)

转载 作者:行者123 更新时间:2023-11-30 23:27:14 26 4
gpt4 key购买 nike

我有一种方法可以从 zip 文件中打开图像,并将该图像作为 BitmapImage 返回。

public BitmapImage GetImageFromSource()
{
using (System.IO.Compression.ZipArchive zi = System.IO.Compression.ZipFile.Open(ZipFileLocation, System.IO.Compression.ZipArchiveMode.Read))
{
using (Stream source = zi.GetEntry(InternalLocation).Open())
{
BitmapImage img = new BitmapImage();
img.BeginInit();
img.CacheOption = BitmapCacheOption.OnLoad;
img.StreamSource = source;
img.EndInit();

//sleeping here allows img to complete initialization
//not sleeping here means img is still blank upon return
System.Threading.Thread.Sleep(100);

return img;
}
}
}

zip 文件包含大图像和小图像的混合。如果图像很大,img 可能在程序到达返回之前还没有完成初始化。如果发生这种情况,该方法将返回一个空白的 BitmapImage。

如果我在返回前 sleep ,该方法有效,并且有足够的延迟,大图像被成功初始化。

sleep 并不理想,因为它会通过不必要地锁定主线程来减慢程序速度。如何获取等待初始化完成再返回BitmapImage的方法?

我已经尝试了 IsDownloading 和 DownloadCompleted 事件。 IsDownloading 始终设置为“true”,并且 DownloadCompleted 似乎从未被触发。

最佳答案

锁定等待位图加载的主线程并不是很好的做法,框架可能出于某种原因需要延迟加载。这实际上就是这里发生的事情,当加载确实发生时,您已经处理了文件变量。您可以立即返回图像,但您应该将这些变量的处理推迟到文件加载之后:

public BitmapImage GetImageFromSource()
{
System.IO.Compression.ZipArchive zi = System.IO.Compression.ZipFile.Open(ZipFileLocation, System.IO.Compression.ZipArchiveMode.Read);
Stream source = zi.GetEntry(InternalLocation).Open();

BitmapImage img = new BitmapImage();
img.DownloadCompleted += (s, e) =>
{
source.Dispose();
zi.Dispose();
};

img.BeginInit();
img.CacheOption = BitmapCacheOption.OnLoad;
img.StreamSource = source;
img.EndInit();

return img;
}

关于c# - BitmapImage:如何在返回图像之前等待 BitmapImage 初始化? (C#.NET),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36610442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com