2016-10-28 4 views
0

Привет, ребята, я не понимаю, как обрабатывать поток пользовательского интерфейса, поэтому я пытаюсь создать много элементов пользовательского интерфейса в дочернем потоке, но Как изменить следующий код, чтобы окно не блокировалось:Как создать большое количество элементов управления без блокировки основного потока?

public void CreateCtr(string name) 
    { 
     Button btn = new Button(); 
     btn.Content = name; 
     btn.Width = 10; 
     btn.Height = 10; 
     content.Children.Add(btn); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     int count = 100000; 
     Task.Factory.StartNew(()=> { 
      for (int i = 0; i < count; i++) 
      { 
       this.Dispatcher.BeginInvoke(new Action(()=> { 
        CreateCtr(i.ToString()); 
       })); 
      } 
     }); 
    } 
+7

Серьезно, зачем кому-то нужна форма с 100 000 кнопок?!? – NineBerry

+0

На самом деле, я просто хочу знать, есть ли способ сделать это. – Joker

+0

Вы не можете создавать 100 000 кнопок, и это не имеет никакого отношения к времени, оно имеет все, что связано с тем, что вам не разрешат это делать. –

ответ

0

Вы должны дать потоку пользовательского интерфейса какое-то пространство, чтобы дышать. С текущим кодом поток пользовательского интерфейса занят обработкой всех заданий кнопки «Создать» и не может перейти к обработке ввода пользователя. Положите минимальную паузу между созданием каждой отдельной кнопки. Через несколько миллисекунд достаточно:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    int count = 100000; 
    Task.Factory.StartNew(() => { 
     for (int i = 0; i < count; i++) 
     { 
      this.Dispatcher.BeginInvoke(new Action(() => { 
       CreateCtr(i.ToString()); 
      })); 
      Thread.Sleep(5); 
     } 
    }); 
} 

Чем дольше пауза, тем более отзывчивым форма становится.

Отметим, что после некоторого времени форма становится менее отзывчивой, потому что после определенного количества компонентов в форме добавление другого компонента занимает очень много времени. Вот где мой первоначальный комментарий становится актуальным: нет никакой возможности для того, чтобы иметь много компонентов в форме, поэтому структура не предназначена для ее правильной обработки.

Что может работать, это не поместить все кнопки в один и тот же родительский контейнер, а создать дерево компонентов, где каждый компонент имеет не более 100 детей. Но опять же: я не вижу какой-либо соответствующей информации.

+0

Q: при создании отдельной кнопки это не большая задача, будет ли лучше работать массив кнопок не на форме, а затем добавить их навалом, скажем, 20/50/100 за раз? – BugFinder

+0

@BugFinder Я не верю, что это улучшит производительность, но вы сможете ее протестировать. :) Что может работать, это не помещать все кнопки в один и тот же родительский контейнер, а создавать дерево компонентов, где каждый компонент имеет не более 100 детей. Но опять же: я не вижу никакого соответствующего использования – NineBerry

0

Возможна работа по отключению диспетчера при добавлении элементов управления.

int count = 100000; 
Task.Factory.StartNew(() => { 
    using (var d = Dispatcher.DisableProcessing()) 
    { 
     for (int i = 0; i < count; i++) 
     { 
      this.Dispatcher.BeginInvoke(new Action(()=> { 
       CreateCtr(i.ToString()); 
      })); 
     } 
    } 
}); 
Смежные вопросы