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

时间:2012-06-07 12:33:39

标签: 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

2 个答案:

答案 0 :(得分:7)

首先,摆脱睡眠旋转,它完全违背了使用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。现在应该没问题。

答案 1 :(得分:-2)

尝试

while (!myTask.IsCompleted)
{
    Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
    System.Threading.Thread.Sleep(20);
}