使 WPF UI 在从数据库中读取数据时负责
本文关键字:数据 读取 数据库 WPF UI | 更新日期: 2023-09-27 18:36:31
我有C# WPF应用程序,它从数据库中读取数据,然后做一些工作。但问题是当我读取数据时,我的 UI 没有响应。我已经尝试了任务和调度程序。他们都无济于事。下面的代码在button_click事件中。这是代码:
DataSet ds;
DataTable dt = new DataTable();
Task myTask = new Task(new Action(() =>
{
//GetMyDataSet() returns DataSet
ds = GetMyDataSet();
dt = ds.Tables["MyTableName"];
}));
myTask.Start();
while (!myTask.IsCompleted)
{
System.Threading.Thread.Sleep(1000);
}
//Continue
首先,摆脱睡眠旋转,它完全违背了使用 Task
的目的,因为它不允许 UI 线程在Task
完成之前继续。你不要这样!
Task myTask = Task.Factory.StartNew(
new Action(() =>
{
DataSet ds;
DataTable dt = new DataTable();
//GetMyDataSet() returns DataSet
ds = GetMyDataSet();
dt = ds.Tables["MyTableName"];
// use Invoke/BeginInvoke to update UI
}));
现在,您的任务将与 UI 线程并行运行,直到完成。在Task
代码结束时,使用 Dispatcher.BeginInvoke
更新 UI。现在应该没事了。
尝试
while (!myTask.IsCompleted)
{
Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
System.Threading.Thread.Sleep(20);
}