По сути, изначально происходило то, что поток пользовательского интерфейса завершал загрузку, и поскольку он работал над этим, его нельзя было обновить или нарисовать (работая синхронно). Теперь происходит то, что вы запускаете поток, затем поток пользовательского интерфейса продолжает, а затем пытается назначить локальный файл (который еще не закончил загрузку) для графического блока. Вам следует попробовать одно из следующих:
Вы должны использовать фоновый рабочий для выполнения задачи загрузки.
У него есть события, которые будут очень полезны. DoWork, где вы можете начать загрузку.
Существует также событие RunWorkerCompleted, которое вызывается после завершения Работы. Где вы можете установить изображение там (pictureBox2.Picture = localFile;
).
Это определенно стоит проверить, я думаю, что это самый подходящий способ завершить то, что вы пытаетесь достичь.
Или
Если вы хотите придерживаться темы. Вы можете взять назначение изображения после выполнения Thread.Start()
и вставить его в функцию Worker Thread:
private delegate void MyFunctionCaller();
private static void DownloadMap(ParamForDownload p)
{
WebClient client = new WebClient();
client.DownloadFile(p.Url, p.LocalFile);
DownloadMapComplete(p);
}
private void DownloadMapComplete(ParamForDownload p)
{
if (InvokeRequired == true)
{
MyFunctionCaller InvokeCall = delegate { DownloadMapComplete(p); };
Invoke(InvokeCall);
}
else
{
pictureBox2.Picture = p.LocalFile;
}
}