В событии Loaded окна или элемента управления выполните метод для загрузки первого элемента данных.
вызывая метод BeginInvoke для System.Windows.Threading.DispatcherObject для
Элемент пользовательского интерфейса и укажите System.Windows.Threading.DispatcherPriority для фона. когда
этот метод завершил генерацию данных и добавление их в список, добавьте тот же метод в
рекурсивная очередь диспетчера, каждый раз добавляя только один элемент, а затем ставя в очередь вызов
добавить следующий с DispatcherPriority фона.
private ObservableCollection<string> numberDescriptions;
// Declare a delegate to wrap the LoadNumber method
private delegate void LoadNumberDelegate(int number);
private void LoadNumber(int number)
{
// Add the number to the observable collection
// bound to the ListBox
numberDescriptions.Add("Number " + number.ToString());
if(number < 10000)
{
// Load the next number, by executing this method
// recursively on the dispatcher queue, with
// a priority of Background.
//
this.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new LoadNumberDelegate(LoadNumber), ++number);
}
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
// Initialize an ObservableCollection of strings
numberDescriptions =
new ObservableCollection<string>();
// Set it as the ItemsSource for the ListBox
listBox.ItemsSource = numberDescriptions;
// Execute a delegate to load
// the first number on the UI thread, with
// a priority of Background.
//
this.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new LoadNumberDelegate(LoadNumber), 1);
}
см. Рецепты WPF в C # 2008 Асинхронно загружать элементы в ListBox (стр. 460)