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行以上を扱っています)
誰かが私の問題に対して別の解決策を持っていますか? 乾杯!
私は申し訳ありませんが、DoAsyncを呼び出すと正解です。私は問題のコードを簡略化し、この場所を忘れていました;) –
そしてそのtw変数はどうですか? :) –
再び申し訳ありません..あなたは今見てみることができますか? –