Как избежать небольшого замораживания подарка в picturebox при загрузке формы

#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