Если создаваемые объекты получены из Freezable, то вы можете создать их в потоке, отличном от потока пользовательского интерфейса - вам просто нужно вызвать Freeze для них, пока вы находитесь в рабочем потоке, и затем вы можете передать ихнад.Однако это не поможет вам для элементов, которые не являются производными от Freezable.
Вы пытались создавать их по одному?Следующий пример не выполняет никакой полезной работы, но он показывает, как базовая структура выполняет большую часть работы небольшими кусочками:
int count = 100;
Action slow = null;
slow = delegate
{
Thread.Sleep(100);
count -= 1;
if (count > 0)
{
Dispatcher.BeginInvoke(slow, DispatcherPriority.Background);
}
};
Dispatcher.BeginInvoke(slow, DispatcherPriority.Background);
«Работа» здесь заключается в том, чтобы спать одну десятуювторой.(Таким образом, если вы замените это реальной работой, которая занимает примерно столько же времени, вы получите то же самое поведение.) Это происходит 100 раз, так что в общей сложности 10 секунд «работы».Пользовательский интерфейс остается достаточно отзывчивым в течение всего времени - такие вещи, как перетаскивание окна, становятся немного менее плавными, но его вполне можно использовать.Измените оба этих приоритета фона на «Обычный», и приложение заблокируется.
Ключевым моментом здесь является то, что мы в конечном итоге возвращаемся после выполнения каждого небольшого куска работы, ставя в очередь следующий бит - в итоге мы вызываем Dispatcher.BeginInvoke100 раз, а не один раз.Это дает UI возможность регулярно реагировать на вводимые данные.