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 행 이상을 처리하고 있습니다)
누군가 내 문제에 대해 다른 해결책을 가지고 있습니까? 건배!
죄송합니다. DoAsync를 호출하여 올바르게 작성했습니다. 나는 문제의 코드를 단순화하고이 장소를 잊었다;) –
그리고 그 tw 변수는? :) –
죄송합니다 .. 지금 보시 겠어요? –