我有一个方法(保存数据),我想在不同的线程中运行。问题是数据被非常频繁地保存,因为保存是由一些其他操作(不仅仅是用户操作)触发的。这实际上意味着,如果我开始使用async / await,我需要修改最后100个方法(直接或间接调用此方法),这将需要大量测试。
所以,如果我这样做
// start the busy indicator
IsBusy = true;
// start the task (saving data)
task.Start();
// now I need to stop further code execution, until task completes, but still allow UI to run that wait indicator.
如何在任务完成之前不继续执行代码,并且仍允许UI运行该繁忙指示符?
答案 0 :(得分:2)
你可以使用延续。像这样:
IsBusy = true;
System.Threading.Tasks.Task.Factory.StartNew(() =>
{
// save data
}).ContinueWith((t) =>
{
// do more work
IsBusy = false;
});
答案 1 :(得分:0)
您是否可以使用async
和await
个关键字?这些非常有助于保持异步,而没有乱码的连续代码(编译器会在幕后为你做)。
如果是这样,我强烈建议您将方法分解为基于Task
的操作。
例如:
async void StartButtonClicked()
{
startButton.IsEnabled = false;
await DoSomeWork();
startButton.IsEnabled = true;
}
Task DoSomeWork()
{
// Do some long running background task here.
}
神奇的是await
关键字将等到Task
完成,但不会阻止UI线程。它是如何做到的?它会记录方法的其余部分(在await
之后作为Task
的延续)。
结果是异步代码完美运行并且看起来仍然很干净。查看Microsoft's Guide on Async/Await Programming
答案 2 :(得分:0)
使用DispatcherFrame似乎是一种快速的解决方法。