如何在循环中等待而不在C#中阻止UI

时间:2013-09-14 17:21:52

标签: c# loops timer wait

我正在开展一个项目,我需要一些帮助。这是一段代码:

private void MassInvoiceExecuted()
{
    foreach (Invoice invoice in Invoices)
    {
        DoStuff(invoice);
        //I'd like to wait 8 seconds here before the next iteration
    }

    RefreshExecuted();
}

如何轻松完成?我试过的是:

private async void MassInvoiceExecuted()
{
    foreach (Invoice invoice in Invoices)
    {
        DoStuff(invoice);
        await Task.Delay(8000);
    }

    RefreshExecuted();
}

虽然它确实等了8秒而没有冻结用户界面,但它还在 RefreshExecuted()之前等待了大约30秒; 我显然不熟悉async await但它似乎是一个好主意

无论如何,我需要在每次迭代后等待8秒而不阻止UI,因为我必须能够通过按钮点击中止循环。我考虑过计时器。将间隔设置为8000并创建包含究竟是什么的tick方法?我不能把那些在MassInvoiceExecuted中的东西都放在tick方法中,因为这不对。

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:1)

我理解你的答案也许你想要

private async void MassInvoiceExecuted()
{     
    foreach (Invoice invoice in Invoices)
    {
        DoStuff(invoice);
        RefreshExecuted();
        await Task.Delay(8000);
    }
}

但实际上不知道您是否有任何理由仅在所有处理结束时更新UI。

答案 1 :(得分:0)

MassInvoiceExecuted方法一旦命中await关键字,就会将控制权返回给UI线程。因此,您的MassInvoiceExecuted方法仍然会运行并且每张发票等待8秒,我认为您有4张发票需要处理....