在等待另一个线程完成时刷新UI

时间:2013-12-27 17:35:49

标签: c# wpf c#-4.0

我有一个方法(保存数据),我想在不同的线程中运行。问题是数据被非常频繁地保存,因为保存是由一些其他操作(不仅仅是用户操作)触发的。这实际上意味着,如果我开始使用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运行该繁忙指示符?

3 个答案:

答案 0 :(得分:2)

你可以使用延续。像这样:

        IsBusy = true;
        System.Threading.Tasks.Task.Factory.StartNew(() =>
        {
            // save data
        }).ContinueWith((t) =>
        {
            // do more work

            IsBusy = false;
        }); 

答案 1 :(得分:0)

您是否可以使用asyncawait个关键字?这些非常有助于保持异步,而没有乱码的连续代码(编译器会在幕后为你做)。

如果是这样,我强烈建议您将方法分解为基于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似乎是一种快速的解决方法。