2011-12-13 6 views
5

Tôi đang tải trong chế độ xem dữ liệu một số dữ liệu (1.200.000 hàng) và Ứng dụng sẽ mất quá nhiều thời gian để tải và đôi khi bị đóng băng.Tải dữ liệu vào một DataGrid không đồng bộ

Tôi không biết cách tải chúng không đồng bộ? (với progressBar có thể).

Tôi có thể tìm trợ giúp ở đây không?

Trả lời

3

Chia nhỏ dữ liệu tải thành các đoạn nhỏ hơn, nói 100 đến 1000 hàng cùng một lúc. Nếu lưới WPF là databound để thu thập dữ liệu của bạn, và bộ sưu tập là một bộ sưu tập quan sát được (thực hiện INotifyCollectionChanged), WPF sẽ tự động cập nhật màn hình khi dữ liệu mới được thêm vào bộ sưu tập. Bạn cũng nên xem xét sử dụng các điều khiển danh sách hoặc lưới ảo được kết hợp với nguồn dữ liệu phân trang, do đó chỉ dữ liệu hiện được hiển thị trên màn hình mới được tải (thay vì 1,2 triệu hàng dữ liệu trong bộ nhớ). Điều này sẽ thực hiện "chunking" cho bạn và sẽ cho phép bạn trình bày về cơ bản một lượng dữ liệu vô hạn cho người dùng với rất ít sử dụng bộ nhớ hoặc độ trễ mạng.

Check-out này SO bài viết về lấy dữ liệu không đồng bộ cho một ListBox ảo: How do I populate a ListView in virtual mode asynchronously?

5

Tôi có một ứng dụng mà tôi đang làm một cái gì đó rất giống nhau sử dụng Threading. Mã này nên cập nhật dòng dữ liệu của bạn một dòng tại một thời điểm trong khi mã phía sau đang chạy.

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))); 
    }  
}