我想在将数据加载到ObservableCollection
(绑定到DataGrid
)时阻止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);
});
}
}
一般来说,一切正常。方法是异步的,直到它来到qazxsw poi。它完全冻结了UI,直到qazxsw poi循环结束。
我正在谷歌搜索解决方案,并找到了Products.Add(prd)
页面,关于AsyncObservableCollection,但解决方案对我不起作用。
我还发现了一些在while
循环中添加this的说法。它确实使用户界面不会变得费力,但它会大大减慢填充Thread.Sleep(millisecondsTimeout:1);
的过程(我正在处理> 50k行)
有人为我的问题有另一种解决方案吗?干杯!
每次向ObservableCollection添加项目时,它都会更新UI。您可以在列表中添加产品然后覆盖ObservableCollection。
while