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

Adi*_*dov 1 c# wpf multithreading

我有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
Run Code Online (Sandbox Code Playgroud)

Tud*_*dor 7

首先,摆脱睡眠旋转,它完全违背了使用a的目的,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
      }));
Run Code Online (Sandbox Code Playgroud)

现在,您的任务将与UI线程并行运行,直到完成.在Task代码结束时使用Dispatcher.BeginInvoke更新UI.现在应该没问题.