zhenan Ответов: 1

Windows form зависает при попытке обновить пользовательский элемент управления-как это исправить?


Мы создаем 16 пользовательских элементов управления в форме windows. В пользовательском элементе управления отображается множество gif-анимаций. Я пытаюсь вызвать пользовательский элемент управления, чтобы обновить эти анимации, используя приведенный ниже код. guiLogUpdateButton_Click-это кнопка в форме windows. Существует задача, которая будет запускать функцию тестирования после нажатия кнопки. SlotModel - это объект пользовательского управления, содержащий всю информацию. UpdateView-это функция, называемая представлением пользовательского элемента управления. И по мере того, как анимация обновляется до формы windows, форма windows застревает/зависает на программном обеспечении.

private void guiLogUpdateButton_Click(object sender, EventArgs e)
        {
                            Task b = Task.Run(() =>
                                {
                                    testing();
            });
        }

        private void testing()
        {
                SlotModel[] slotModel = new SlotModel[16];
                for (int slotNumber = 0; slotNumber < 16; slotNumber++)
                {
                    int i = slotNumber;
                    slotModel[i] = new SlotModel(i);
                    Task u = Task.Run(() =>
                    {
                        slotModel[i].status.Clear();
                        slotModel[i].status.Add(enumSlotStatus.Running);
                        UpdateView(slotModel[i]);
                        Thread.Sleep(500);
                        slotModel[i].status.Clear();
                        slotModel[i].status.Add(enumSlotStatus.Pass);
                        UpdateView(slotModel[i]);
                        Thread.Sleep(500);
                        slotModel[i].status.Clear();
                        slotModel[i].status.Add(enumSlotStatus.Fail);
                        UpdateView(slotModel[i]);
                        Thread.Sleep(500);
                    });
                }

        }



//Это код для пользовательского элемента управления ниже
public void UpdateView(Gen5.Model.SlotModel slotModel)
        {

if (InvokeRequired)
            {
                this.Invoke((MethodInvoker)delegate { UpdateView(slotModel); });
            }
            else
            {
//this is where the user control get updated
}<pre><pre>


Что я уже пробовал:

Мы пробуем другие способы сделать это, но все они создают отставание в программном обеспечении.

1 Ответов

Рейтинг:
2

Amit_gupta

Основной причиной замораживания вашего приложения является поток.Функция Sleep (500), использующая задачу.Задержка (500) исправит вашу проблему.

Наряду с этим я также предпочитаю, чтобы вы установили значение DoubleBuffered равным true в свойствах формы.