1

我有 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
4

2 回答 2

7

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

现在您的任务将与 UI 线程并行运行,直到完成。在Task代码末尾Dispatcher.BeginInvoke用于更新 UI。现在应该可以了。

于 2012-06-07T12:36:15.273 回答
-2

尝试

while (!myTask.IsCompleted)
{
    Dispatcher.Invoke(DispatcherPriority.Background, new ThreadStart(delegate { }));
    System.Threading.Thread.Sleep(20);
}
于 2012-06-07T12:50:08.343 回答