我的英语不是很好,对此我感到很抱歉,但是我尝试完美地告诉我的问题
这是我用于加载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 row时。程序不会加载所有日期的30秒或以上。看起来我的程序datagrid空了30秒或更长时间。
我想按10行10行加载数据,我的意思是我想在加载10行之后再填充10行后填充数据网格, 喜欢 10 20 30 40 .... 有了这个我的数据网格将永远不会为空 并且数据将缓慢加载 有人可以告诉我最好的方法吗?
答案 0 :(得分:2)
您应该在后台线程上调用数据库,但是在UI线程上设置ItemsSource
属性。因此,您的Task
应该返回IEnumerable<User>
,但不要触摸DataGrid
。然后,您可以等待Task
。
只要从UI线程调用Loading
方法,这应该可以工作:
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;
}
但是由于查询一次返回所有行,所以没有“何时加载10行”。您可以一次全部获得它们。如果您不想这样做,则需要使用某种数据读取器来逐一读取记录。您可以创建一个ObservableCollection
并间隔填充一次。这是一个应该让您想到的示例:
ObservableCollection<VW_Users> collection = new ObservableCollection<VW_Users>();
object @lock = new object();
BindingOperations.EnableCollectionSynchronization(collection, @lock);
DataGrid_User.ItemsSource = collection;
Task.Run(() =>
{
using (SqlConnection connection = new SqlConnection("connection string...."))
{
SqlCommand command = new SqlCommand("select * From VW_Users where GymID = @GymId", connection);
command.Parameters.AddWithValue("GymId", PublicVar.ID + " " + SearchStringForUser());
connection.Open();
SqlDataReader reader = command.ExecuteReader();
if (reader.HasRows)
{
const int N = 10;
VW_Users[] cache = new VW_Users[N];
int counter = 0;
while (reader.Read())
{
VW_Users obj = new VW_Users();
obj.Property1 = Convert.ToString(reader["Column1"]);
cache[counter] = obj;
//...and so on for each property...
if (++counter == N)
{
//add N items to the source collection
foreach (VW_Users x in cache) collection.Add(x);
counter = 0;
//add a delay so you actually have a chance to see that N items are added at a time
System.Threading.Thread.Sleep(1000);
}
}
//add any remaining items
for (int i = 0; i<counter; ++i) collection.Add(cache[i]);
}
reader.Close();
}
});