gpt4 book ai didi

c# - 在 BackgroundWorker 中加载图片

转载 作者:太空狗 更新时间:2023-10-29 21:58:45 31 4
gpt4 key购买 nike

最近几天我一直在处理 backgroundWorker 的问题。我一直在浏览 MSDN 上的论坛和文档,但仍然没有找到答案,所以现在我想请教各位聪明人。

长话短说,我有一个自定义用户控件,它由 ScrollViewer 中的 WrapPanel 组成。 WrapPanel 包含一些元素,当它们滚动到 View 中时会收到通知。然后元素应该加载并显示图像,这就是问题所在。为了不锁定 gui 线程,我将图像加载到 BackgroundWorker 中,但 GUI 仍然停止。这是表示包含在 WrapPanel 中的元素的类的代码:

class PictureThumbnail : INotifyingWrapPanelElement
{
private string path;
private Grid grid = null;

private BackgroundWorker thumbnailBackgroundCreator = new BackgroundWorker();
private delegate void GUIDelegate();
private Image thumbnailImage = null;

public PictureThumbnail(String path)
{
this.path = path;
visible = false;
thumbnailBackgroundCreator.DoWork += new DoWorkEventHandler(thumbnailBackgroundCreator_DoWork);

}

void thumbnailBackgroundCreator_DoWork(object sender, DoWorkEventArgs e)
{
BitmapImage bi = LoadThumbnail();
bi.Freeze(); //If i dont freeze bi then i wont be able to access

GUIDelegate UpdateProgressBar = delegate
{
//If this line is commented out the GUI does not stall. So it is not the actual loading of the BitmapImage that makes the GUI stall.
thumbnailImage.Source = bi;
};
grid.Dispatcher.BeginInvoke(UpdateProgressBar);
}


public void OnVisibilityGained(Dispatcher dispatcher)
{
visible = true;
thumbnailImage = new Image();
thumbnailImage.Width = 75;
thumbnailImage.Height = 75;

//I tried setting the thumbnailImage.Source to some static BitmapImage here, and that does not make the GUI stall. So it is only when it is done through the GUIDelegate for some reason.
grid.Children.Add(thumbnailImage);
thumbnailBackgroundCreator.RunWorkerAsync();
}



private BitmapImage LoadThumbnail()
{
BitmapImage bitmapImage = new BitmapImage();

// BitmapImage.UriSource must be in a BeginInit/EndInit block
bitmapImage.BeginInit();
bitmapImage.UriSource = new Uri(path);
bitmapImage.DecodePixelWidth = 75;
bitmapImage.DecodePixelHeight = 75;
bitmapImage.EndInit();

return bitmapImage;
}
}

我在代码中添加了一些注释,解释了我尝试过的一些东西以及我有哪些线索。但我会在这里再写一遍。如果我只是在 backgroundWorker 中加载 BitmapImage,但不将其应用为 thumbnailImage 的源,则 GUI 不会停止(但显然没有图像显示)。此外,如果我在 OnVisibilityGained 方法中将 thumbnailImage 的 Source 设置为某个预加载的静态 BitmapImage(因此在 GUI 线程中),则 GUI 不会停止,因此 Image.Source 的实际设置不是罪魁祸首。

最佳答案

您应该使用 backgroundworker 的报告功能,它让您无需调用即可直接访问表单的控件。

关于c# - 在 BackgroundWorker 中加载图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12583594/

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