wpf - 寻找在归档datagrid时不冻结ui的方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了wpf - 寻找在归档datagrid时不冻结ui的方法相关的知识,希望对你有一定的参考价值。

我想在将数据加载到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

以上是关于wpf - 寻找在归档datagrid时不冻结ui的方法的主要内容,如果未能解决你的问题,请参考以下文章

wpf 动态更新 UI 而不会冻结 UI

CSV数据无法在DataGrid的WPF ui上呈现[重复]

冻结wpf数据网格中的列

WPF DataGrid - 如何暂停数据绑定中的 UI 更新并稍后进行批量更新

WPF中的DataGrid 数据动态刷新UI

WPF Datagrid:通过已使用 ValueConverter 转换的 UI 编辑值 [关闭]