2017-12-21 42 views
0

DataGrid에 바인드되는 ObservableCollection에 데이터를로드하는 동안 UI가 멈추지 않도록하고 싶습니다. 이미 수행 한 어떤wpf - DataGrid를 채우는 동안 freez UI를 사용하지 않는 방법을 찾고 있습니다.

은 다음과 같습니다

ObservableCollection에 : 얻을

private ObservableCollection<Product> _products = new ObservableCollection<Product>(); 
public ObservableCollection<Product> Products 
{ 
    get { return _products; } 
    set 
    { 
     _products = value; 
     OnPropertyChanged(); 
    } 
} 

의 메소드 제품 :

void GetProducts() 
{ 
    Products.Clear(); 

    var query = "Select * from Products"; 

    try 
    { 
     SqlCommand sqlCommand = 
     new SqlCommand 
     (
      query, 
      Connection() 
     ); 

     //creating async task 
     var task = Task.Run(() => 
      DoAsyns2(sqlCommand)); 
     await task; 
    } 
    catch (Exception exception) 
    { 

    } 
} 

내 비동기 방식 :

internal void DoAsyns2(SqlCommand sqlCommand) 
{ 
    SqlDataReader reader = sqlCommand.ExecuteReader(); 
    Product prd; 

    while (reader.Read()) 
    { 
     prd = new Product() 
     { 
      Name = reader["Name"].ToString(), 
      Amout = Convert.ToDecimal(reader["Amout"]), 
      Price = Convert.ToDecimal(reader["Price"]) 
     }; 

     Dispatcher.Invoke(() => 
     { 
      Products.Add(prd); 
     }); 
    } 
} 

일반적으로 모든 것이 정상적으로 작동합니다. 메서드는 Products.Add(prd)에 도달 할 때까지 비동기입니다. 그것은 while 루프가 끝날 때까지 UI를 고정시킵니다.

해결책을 찾기 위해 google을 파고 있었는데 AsyncObservableCollection에 대해 this 페이지가 있지만 솔루션이 제대로 작동하지 않습니다.

또한 Thread.Sleep(millisecondsTimeout:1);을 루프 안에 넣으려고합니다. while 루프. UI가 요금을 내지 않지만, DataGrid을 극적으로 채우는 과정이 느려집니다. (저는 50K 행 이상을 처리하고 있습니다)

누군가 내 문제에 대해 다른 해결책을 가지고 있습니까? 건배!

답변

3

ObservableCollection에 항목을 추가 할 때마다 UI가 업데이트됩니다. List를 만들어 제품을 추가 한 다음 ObservableCollection을 덮어 쓸 수 있습니다.

internal void DoAsyns2(SqlCommand sqlCommand) 
{ 
    SqlDataReader reader = sqlCommand.ExecuteReader(); 
    Product prd; 
    List productList = new List<Product>(); 

    while (reader.Read()) 
    { 
    prd = new Product() 
    { 
     Name = reader["Name"].ToString(), 
     Amout = Convert.ToDecimal(reader["Amout"]), 
     Price = Convert.ToDecimal(reader["Price"]) 
    }; 
     productList.add(prd); 
    } 
    } 
    Dispatcher.Invoke(() => 
    { 
    Products = new ObservableCollection<Product>(productList); 
    }; 
} 
+0

죄송합니다. DoAsync를 호출하여 올바르게 작성했습니다. 나는 문제의 코드를 단순화하고이 장소를 잊었다;) –

+0

그리고 그 tw 변수는? :) –

+0

죄송합니다 .. 지금 보시 겠어요? –