C# 用异步等待方法填充数据网格
我的英语不是很好抱歉,但我尽量把我的问题说得很清楚 下面是我加载datagrid的方法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
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属性分配给该列表。