2011-12-13 3 views
5

Я загружаю в datagrid просмотр некоторых данных (1 200 000 строк), а приложение занимает слишком много времени для загрузки и иногда зависает.Асинхронно загружать данные в datagrid

Я не знаю, как загрузить их асинхронно? (возможно, с progressBar).

Могу ли я найти помощь здесь?

ответ

3

Разбить загрузку данных на более мелкие куски, скажем, от 100 до 1000 строк за раз. Если сетка WPF привязывает данные к вашему сбору данных, а коллекция является наблюдаемой коллекцией (реализует INotifyCollectionChanged), WPF автоматически обновит отображение, когда новые данные будут добавлены в коллекцию.

Вы также должны рассмотреть возможность использования виртуализированных элементов управления списком или сеток в сочетании с источниками данных поискового вызова, так что будут загружены только данные, которые в настоящее время отображаются на экране (вместо 1,2 миллиона строк данных в памяти). Это позволит вам выполнить «chunking» и позволит вам представить в основном бесконечное количество данных для пользователя с очень небольшим использованием памяти или сетевым лаг.

Проверить эту SO статью о получении данных в асинхронном режиме для виртуального ListBox: How do I populate a ListView in virtual mode asynchronously?

5

У меня есть приложение, в котором я делаю что-то очень похожее, используя Threading. Этот код должен обновлять ваши данные по одной строке за раз, пока работает код.

using System.Windows.Threading; 

private void Run() 
{ 
    try 
    { 
     var t = new Thread(Read) { IsBackground = true }; 
     t.Start(); 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

private void Read() 
{ 
    foreach (/* whatever you are looping through */) 
    { 
     /* I recommend creating a class for the result use that for the 
      datagrid filling. */ 
     var sr = new ResultClass() 

     /* do all you code to generate your results */ 

     Dispatcher.BeginInvoke(DispatcherPriority.Normal, 
           (ThreadStart)(() => dgResults.AddItem(sr))); 
    }  
} 
Смежные вопросы