#vb.net #async-await #backgroundworker
#vb.net #асинхронный-ожидание #backgroundworker
Вопрос:
Я использую подарок внутри picturebox во время загрузки формы. При каждом открытии в picturebox помещается случайное изображение
PictureBox1.Image = My.Resources.ResourceManager.GetObject("load" amp; r.Next(1, 12))
Проблема в том, что когда я запускаю программу, подарок на самом деле не анимируется должным образом, что приводит к некоторой задержке.
Я попытался использовать backgroundworker с:
Public Async Function MyFunction() As Task
Await Task.Run(Sub()
PictureBox1.Image = My.Resources.ResourceManager.GetObject("load" amp; r.Next(1, 12))
End Sub)
End Function
и внутри form_load я вызываю функцию:
Await MyFunction()
К сожалению, это не решает проблему замораживания gif.
Как я могу это решить?
Комментарии:
1. Вы не можете получить доступ к элементу управления из потока ThreadPool :
Await Task.Run(Sub() PictureBox1.Image = ...
. Кроме того, это совершенно бесполезно, вы просто присваиваете объекту ресурса свойство (которое является объектом , к которому вы не применяете событиеImage
. УстановитеOption Strict On
как можно скорее). Переместите это назначение наForm.Shown
событие. ЕслиGIF
анимация не анимирована правильно, это потому, что вы блокируете поток пользовательского интерфейса чем- то синхронным .2. Я имею в виду первое назначение :
PictureBox1.Image = DirectCast(My.Resources.ResourceManager.GetObject("load" amp; r.Next(1, 12)), Image)
Я полагаю, вы знаете, чтоr.Next(1, 12)
это дает вам значения от 1 до 11.3. Привет, Джими, я хочу узнать об этом больше. Я переношу назначение
PictureBox1.Image = DirectCast(My.Resources.ResourceManager.GetObject("load" amp; r.Next(1, 12)), Image)
в событие Form.show. Теперь у меня есть другой код в этой форме2, который должен быть своего рода заставкой. Может ли загрузка form1 повлиять на загрузку form2? Form2 отображается первой. Теперь, должен ли я заполнить picturebox (который выбирает из файла ресурсов изображение x от 1 до 11 для отображения в picturebox специально) в другом потоке? если да, не могли бы вы предложить ссылку на документацию? Спасибо4. Я не знаю, какой еще код у вас там есть и что этот код делает. Вы ничего из этого не показали. — Поток / задача здесь ничего не сделает: анимация изображения — это внутренняя функциональность элемента управления PictureBox, который выполняется в потоке пользовательского интерфейса — обратите внимание, что VB. Net имеет встроенную поддержку заставки . Попробуйте использовать эту функцию, если вы этого не делаете, вместо того, чтобы создавать свои собственные.
5. Привет, Карен, что-то вроде этого? Частный асинхронный подраздел SplashForm_Load(отправитель как объект, e как EventArgs) обрабатывает MyBase. Загрузить ожидающую задачу.Выполнить(асинхронную функцию() pictureBox1.InvokeIfRequired( Sub(PictureBox) pictureBox1.Image = DirectCast(My.Resources. ResourceManager. GetObject(«load» amp; r.Next(1, 12)), Изображение) End Sub) Ожидает задачи. Задержка (500) Функция завершения) Завершение Sub