[英]How can I load multiple images using LoadAsync() in C#?
我正在尝试更新 GUI,并且我有一个使用 LoadAsyc() 的异步 function,当我只加载一个图像时,它可以工作,但是当我尝试加载多个图像时,第二个不显示。
这是我的代码:
public UserFriendlyInterface()
{
InitializeComponent();
locationFileH5 = "";
serverStatus = false;
ipAddress = getLocalIPAddress();
port = 5000;
watcher = new FileSystemWatcher(@"flask_server\cnn\_prepImages_");
watcher.EnableRaisingEvents = true;
watcher.Changed += watcher_Changed;
}
private void watcher_Changed(object sender, FileSystemEventArgs e)
{
updateImages();
}
async Task updateImages()
{
pictureBoxNormalImg.WaitOnLoad = false;
pictureBoxNormalImg.LoadAsync(@"flask_server\cnn\_prepImages_\normal.jpg");
pictureBoxSegmentation.WaitOnLoad = false;
pictureBoxSegmentation.LoadAsync(@"flask_server\cnn\_prepImages_\segmentation.jpg");
}
您可以通过查询FileSystemEventArgs
object 的Name
属性并仅更新相应的PictureBox
来更稳健地实现您想要实现的目标。
private static void Watcher_Changed(object sender, FileSystemEventArgs e)
{
PictureBox pictureBox;
switch (e.Name.ToLowerInvariant())
{
case "normal.jpg": pictureBox = pictureBoxNormalImg; break;
case "segmentation.jpg": pictureBox = pictureBoxSegmentation; break;
default: pictureBox = null; break;
}
if (pictureBox != null)
{
Image image = null;
try
{
using (var temp = new Bitmap(e.FullPath))
{
image = new Bitmap(temp);
}
}
catch { } // Swallow exception
if (image != null)
{
pictureBox.Invoke((MethodInvoker)(delegate ()
{
pictureBox.Image = image;
}));
}
}
}
我会避免使用LoadAsync
方法,因为它主要用于从 Internet 加载图像,而且我并不完全信任它。
更新:我的初始代码有两个问题:
1) 被新位图(filePath) 锁定的空闲文件
2) FileSystemWatcher Changed 事件被引发两次
更新的代码解决了这些问题(希望如此),但不是以最强大或最有效的方式。
更新:为了使代码更高效,通过避免多次触发Changed
事件导致的图像重复加载,您可以使用此答案中的扩展方法OnChanged
。 替换下面的行就足够了:
watcher.Changed += Watcher_Changed;
...有了这个:
watcher.OnChanged(Watcher_Changed, 100);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.