#.net #vb.net #picturebox
#.net #vb.net #picturebox
Вопрос:
Я использую VB.NET для загрузки изображений с URL-адреса в элемент управления PictureBox с помощью LoadAsync. Часто это очень маленькие изображения — иногда размером 76х76 пикселей. Задержка их отображения на экране является чрезвычайной. Сначала я думал, что это связано со временем загрузки, но я добавил журнал к событию loadComplete и обнаружил, что загрузка изображения заняла 0,29 секунды, но еще 21 секунда (на мой секундомер) для отображения.
Public Sub ShowImage(ByRef image As PictureBox, imgUrl as String)
Log("Starting to load image")
AddHandler image.LoadCompleted, ImgFinish(image)
image.Image = Nothing
image.CancelAsync()
image.LoadAsync(imgUrl)
image.Visible = True
End Sub
Private Function ImgFinish(ByRef image As PictureBox)
Log("Image loading complete")
Return Nothing
End Function
И вывод журнала:
(17:03:59.930) vb_Utilities.ShowImage[697] - V:Starting to load image
(17:04:00.220) vb_Utilities.ImgFinish[731] - Image loading complete
Затем с помощью секундомера я засек время еще на 21 секунду — до 17:25 — прежде чем появилось изображение)
Я также попробовал добавить изображение.Обновить() к функции ImgFinish, думая, что, возможно, это просто не было перерисовкой, но это не помогло.
Что может быть причиной этой задержки? Что я могу проверить или попробовать?
Комментарии:
1. Понятия не имею, в чем проблема, но вы должны изменить подпись
ImgFinish
, чтобы она соответствовала событию. Смотрите: PictureBox. Событие LoadCompleted.2. изменение обработчика на «Addressof ImgFInish» стекает обработчики — то есть каждый раз, когда он вызывается, он повторно добавляет обработчик для события, так что в конечном итоге ImgFinish вызывается 100 или более раз. По причине, которую я действительно не знаю, вызов функции таким образом выполняет ее только один раз
3. «он повторно добавляет обработчик для события, поэтому в конечном итоге ImgFinish вызывается 100 или более раз …. вызов функции таким образом выполняет ее только один раз» — Решение проблемы, вызванной плохим решением кодирования с помощью какого-либо взлома, не является хорошей идеей. Добавляйте обработчик только один раз в методе конструктора или OnLoad. В качестве альтернативы, добавьте его, как вы делаете в данный момент, но удалите его
ImgFinish
.4. Я буквально добавил его только для записи метки времени для loadComplete. Это не часть моего решения, и я удаляю его, как только выясню, почему изображение появляется через 21 секунду после его загрузки