繁体   English   中英

如何在 C# 中使用 LoadAsync() 加载多个图像?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM