Как я могу загрузить несколько изображений с помощью LoadAsync () в C #? - PullRequest
1 голос
/ 22 сентября 2019

Я пытаюсь обновить графический интерфейс, и у меня есть асинхронная функция, которая использует LoadAsyc (), когда я загружаю только одно изображение, оно работает, но когда я пытаюсь загрузить более одного, второе не отображается.

Это мой код:

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");
}

1 Ответ

0 голосов
/ 23 сентября 2019

То, что вы пытаетесь достичь, может быть достигнуто более надежно, запрашивая свойство Name объекта FileSystemEventArgs и обновляя только соответствующий 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, поскольку он предназначен главным образом для загрузки изображений из Интернета, а также потому, что я не полностью ему доверяю .


Обновление: Были две проблемы с моим исходным кодом:
1) Свободный файл заблокирован новым растровым изображением (filePath)
2) FileSystemWatcher Changedсобытие вызывается дважды

Обновленный код решает эти проблемы (надеюсь), но не самым надежным или эффективным способом.


Обновление: Чтобы сделать код более эффективным, избегая повторной загрузки изображений, вызванных многократными срабатываниями события Changed, вы можете использовать метод расширения OnChanged, найденный в этого ответа .Достаточно заменить строку ниже:

watcher.Changed += Watcher_Changed;

... на эту:

watcher.OnChanged(Watcher_Changed, 100);
...