我有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
答案 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);
}