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

问题描述 投票:0回答:1

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

有人为我的问题有另一种解决方案吗?干杯!

c# wpf multithreading asynchronous datagrid
1个回答
3
投票

每次向ObservableCollection添加项目时,它都会更新UI。您可以在列表中添加产品然后覆盖ObservableCollection。

while
© www.soinside.com 2019 - 2024. All rights reserved.