簡體   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