То, что вы пытаетесь достичь, может быть достигнуто более надежно, запрашивая свойство 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);