У меня такое ощущение, что у вас может не так много вариантов, кроме работы в потоке пользовательского интерфейса.
Если бы это был случай, когда долгое время было связано со сбором и упорядочением данных, тогда лучшим вариантом был бы фоновый поток, а затем вызывать любые свойства зависимостей пользовательского интерфейса, используя объект Dispatcher. Я предполагаю, что время не собирать какие-либо данные, это чисто до программного создания UIElements.
Насколько я понимаю, элементы пользовательского интерфейса происходят от DispatcherObject
, который получает Dispatcher
из текущего рабочего потока, что исключает создание элементов управления в другом потоке.
Тогда все свойства зависимости при записи в Dispatcher.VerifyAccess
вызовут исключение при обращении к неправильному потоку. Так что это исключает обновление привязки данных и свойств в другом потоке.
Моя первая реакция была бы такой, как писал @Kent.
Чтобы уточнить, если у вас есть цикл foreach
для каждой строки с другим foreach
для каждого столбца, то вы можете, даже если вы находитесь в правильном потоке пользовательского интерфейса, вызвать Dispatcher.BeginInvoke
, чтобы на мгновение «уступить» своей долгой работе метод. то есть, чтобы разбить его, а затем передать управление обратно в поток пользовательского интерфейса, чтобы затем продолжить добавление в сетку. Усилия макета могут быть значительно больше, и общее время будет больше, но немного быстрее.
private void Window_Loaded(object sender, RoutedEventArgs e)
{
CreateRow(1);
}
private void CreateRow(int i)
{
//
// Construct row i of the grid
//
Dispatcher.BeginInvoke(DispatcherPriority.Background, new EventHandler(delegate { CreateRow(i + 1); }));
}