Я работаю над проектом, и мне нужна помощь. Вот фрагмент кода:Как подождать в цикле без блокировки пользовательского интерфейса в C#
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 секунд без замораживания пользовательского интерфейса также ждали в течение приблизительно 30 секунд перед RefreshExecuted(); Я, очевидно, не знаком с асинкрой, но это казалось хорошей идеей.
В любом случае, я должен ждать 8 секунд после каждой итерации без блокировки пользовательского интерфейса, потому что я должен быть в состоянии прервать цикл нажатием кнопки. Я рассматривал таймеры. Настройка интервала до 8000 и создание метода тика, содержащего , что именно? Я не могу поместить все, что находится в MassInvoiceExecuted внутри метода tick, потому что это было бы неправильно.
Любая помощь будет высоко оценена. Благодаря!
В чем проблема с решением async? Это прекрасно, что я вижу. –
@ AlessandroD'Andria Он ждет 8 секунд, что хорошо. Но также ждет гораздо больше в конце, прежде чем эффекты RefreshExecuted() будут очевидны в пользовательском интерфейсе. Я предполагаю, что это создает несколько потоков, которые ждут друг друга или я не знаю. –
Ну, почему бы просто не переместить метод внутри цикла, нормально, он называется много раз, но по крайней мере каждый раз, когда счет-фактура обрабатывается, ваш пользовательский интерфейс обновляется. –