使 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

使 WPF UI 在从数据库中读取数据时负责

首先,摆脱睡眠旋转,它完全违背了使用 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);
}