【发布时间】:2013-04-03 12:01:51
【问题描述】:
我在 windows 窗体上有一个网格,需要在窗体加载时填充。数据来自数据库。目前我在表单 onload 中调用 LoadData()。所以加载屏幕需要相当长的时间,因为有一个 DB 调用。
这是一个好方法吗? 我不能使用后台工作程序并异步调用 LoadData() 以便加载窗口不会有任何延迟吗?
有人可以解释一下什么是最好的方法吗?
【问题讨论】:
我在 windows 窗体上有一个网格,需要在窗体加载时填充。数据来自数据库。目前我在表单 onload 中调用 LoadData()。所以加载屏幕需要相当长的时间,因为有一个 DB 调用。
这是一个好方法吗? 我不能使用后台工作程序并异步调用 LoadData() 以便加载窗口不会有任何延迟吗?
有人可以解释一下什么是最好的方法吗?
【问题讨论】:
在表单加载时从数据库同步加载数据不是一个好方法,您应该在单独的线程上异步加载它。
您可以使用以下任一方式:
【讨论】:
注意事项:
我认为最好的方法是对您的查询结果进行排序并按访问的最后代码分页您的结果并使用它:
无效 NextPage()
{
Qr="select Top N from tbl where Code>LastCode order by Code asc";
//读取数据
FirstCode=Drr["Code"];//第一次记录结果
LastCode=Drr["Code"];//最后记录结果
}
无效 PreviousPage()
{
Qr="select Top N from tbl where Code
//读取数据
FirstCode=Drr["Code"];//第一次记录结果
LastCode=Drr["Code"];//最后记录结果
}
希望得到帮助
【讨论】:
您可以简单地使用 Dispatcher 在表单呈现后异步加载数据
/// <summary>
/// Handles the Loaded event of the Window control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.Windows.RoutedEventArgs"/> instance containing the event data.</param>
private void Window_Loaded(object sender, RoutedEventArgs e)
{
this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new LoadDataDelegate(LoadData));
}
private delegate void LoadDataDelegate();
/// <summary>
/// Loads the data.
/// </summary>
private void LoadData()
{
List<string> numberDescriptions = new List<string>();
for (int i = 1; i <= 10000000; i++)
{
numberDescriptions.Add("Number " + i.ToString());
}
listBox1.ItemsSource = numberDescriptions;
}
【讨论】: