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