Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用异步等待方法填充数据网格_C#_Wpf_Datagrid - Fatal编程技术网

C# 用异步等待方法填充数据网格

C# 用异步等待方法填充数据网格,c#,wpf,datagrid,C#,Wpf,Datagrid,我的英语不是很好抱歉,但我尽量把我的问题说得很清楚 下面是我加载datagrid的方法 private Task Loading(Func<string> SearchStringForUser) { return Task.Run(() => { var query = database.Database.SqlQuery<VW_Users>("select * From VW_Users where 1 = 1 And Gym

我的英语不是很好抱歉,但我尽量把我的问题说得很清楚

下面是我加载datagrid的方法

private Task Loading(Func<string> SearchStringForUser)
{

    return Task.Run(() =>
    {

        var query = database.Database.SqlQuery<VW_Users>("select * From VW_Users where 1 = 1 And GymID = " + PublicVar.ID + " " + SearchStringForUser());
        var user = query.ToList();
        Dispatcher.InvokeAsync(() =>
        {
            DataGrid_User.ItemsSource = user;
        });
    });
}
首先,我有一个InvokeAsync,但它不能完美地工作。我的意思是,当加载的数据即将列出时,我的程序会挂起。 无论如何,这不是我的主要问题,但如果有人知道这是什么原因,可以指出它 但我的主要问题是当我有+200行时。程序在30秒或更长时间内不加载所有日期。看起来我的程序datagrid已空了30秒或更长时间

我想按10行10行加载数据,我的意思是我想在加载10行时填充我的数据网格,在接下来的10行之后, 喜欢 10 20 30 40 .... 有了它,我的数据网格将永远不会变空 而且数据加载速度很慢
有人能告诉我最好的方法吗?

您应该在后台线程上调用数据库,但在UI线程上设置ItemsSource属性。因此,您的任务应该返回IEnumerable,但不要接触数据网格。然后,您可以等待任务

如果从UI线程调用加载方法,则应该可以这样做:

private async Task Loading(Func<string> SearchStringForUser)
{
    var user = await Task.Run(() =>
    {
        var query = database.Database.SqlQuery<VW_Users>("select * From VW_Users where 1 = 1 And GymID = " + PublicVar.ID + " " + SearchStringForUser());
        return query.ToList();
    });
    DataGrid_User.ItemsSource = user;
}

您应该在后台线程上调用数据库,但在UI线程上设置ItemsSource属性。因此,您的任务应该返回IEnumerable,但不要接触数据网格。然后,您可以等待任务

如果从UI线程调用加载方法,则应该可以这样做:

private async Task Loading(Func<string> SearchStringForUser)
{
    var user = await Task.Run(() =>
    {
        var query = database.Database.SqlQuery<VW_Users>("select * From VW_Users where 1 = 1 And GymID = " + PublicVar.ID + " " + SearchStringForUser());
        return query.ToList();
    });
    DataGrid_User.ItemsSource = user;
}

您不需要使用调度程序。只需将ItemsSource分配移出任务。在等待查询任务后执行此操作。将加载方法声明为async。无论如何,它不会工作,因为i gett错误:调用线程无法访问此对象,因为其他线程拥有它async,但如果我将ItemsSource移出任务,它将异步工作?这可能吗?还有一个问题,如果它不能像异步一样工作,为什么它被称为InvokeAsync?还有不同的Anvoke和InvokeAsync?您不需要使用Dispatcher。只需将ItemsSource分配移出任务。在等待查询任务后执行此操作。将加载方法声明为async。无论如何,它不会工作,因为i gett错误:调用线程无法访问此对象,因为其他线程拥有它async,但如果我将ItemsSource移出任务,它将异步工作?这可能吗?还有一个问题,如果它不能像异步一样工作,为什么它被称为InvokeAsync?还有不同的beetwen Anvoke和InvokeAsync?非常感谢,它解决了我的次要问题,你能检查我的主要问题吗?@RezaPak:你的查询一次返回所有行,不是吗?因此,当加载10行时,不存在任何问题。你一次就把它们都弄到手了。如果你不想这样,你需要抛弃实体框架或任何你正在使用的ORM,使用某种数据读取器。你是说如何使用数据读取器?有一个MSDN的例子:谢谢你的帮助,我知道了,但最后一个问题是我应该在读的时候写些什么加载数据时,我的datagrid不为空start@RezaPak:您需要创建VW_Users对象,然后将其添加到列表中,然后将ItemsSource属性分配给该列表。非常感谢您,它解决了我的次要问题,您可以检查我的主要问题吗?@RezaPak:您的查询一次返回所有行,不是吗?因此,当加载10行时,不存在任何问题。你一次就把它们都弄到手了。如果你不想这样,你需要抛弃实体框架或任何你正在使用的ORM,使用某种数据读取器。你是说如何使用数据读取器?有一个MSDN的例子:谢谢你的帮助,我知道了,但最后一个问题是我应该在读的时候写什么。读取{this line}加载数据,我的数据网格在加载时不为空start@RezaPak:您需要创建VW_Users对象,然后将其添加到列表中,然后将ItemsSource属性分配给该列表。