2017-12-21 20 views
0

DataGridにバインドされているObservableCollectionにデータを読み込み中にUIがフリーズしないようにします。私はすでにやったwpf - データグリッドの充填中に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

再び申し訳ありません..あなたは今見てみることができますか? –

関連する問題