2013-09-14 3 views
-1

Я работаю над проектом, и мне нужна помощь. Вот фрагмент кода:Как подождать в цикле без блокировки пользовательского интерфейса в 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, потому что это было бы неправильно.

Любая помощь будет высоко оценена. Благодаря!

+1

В чем проблема с решением async? Это прекрасно, что я вижу. –

+0

@ AlessandroD'Andria Он ждет 8 секунд, что хорошо. Но также ждет гораздо больше в конце, прежде чем эффекты RefreshExecuted() будут очевидны в пользовательском интерфейсе. Я предполагаю, что это создает несколько потоков, которые ждут друг друга или я не знаю. –

+0

Ну, почему бы просто не переместить метод внутри цикла, нормально, он называется много раз, но по крайней мере каждый раз, когда счет-фактура обрабатывается, ваш пользовательский интерфейс обновляется. –

ответ

1

За то, что я понимаю из вашего ответа, может быть, вы хотите

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

Но на самом деле Дон» t знать, есть ли у вас причины обновлять интерфейс только в конце всей обработки.

+0

Я собираюсь отметить это как ответ, потому что это заставило меня найти правильный способ сделать это. Я не мог использовать RefreshExecuted() несколько раз, потому что он подключался и обновлял и загружал данные из базы данных слишком много раз, что было не очень удобно. Но ключ был внутри RefreshExecuted(), который я не опубликовал, я знаю, потому что я думал, что это не имеет значения. Ну, это не так. В любом случае, спасибо за эту идею, это помогло мне решить эту проблему! –

+0

Рад помочь. –

0

Метод MassInvoiceExecuted будет возвращать управление потоку пользовательского интерфейса, как только он достигнет ключевого слова ожидания. Таким образом, ваш метод MassInvoiceExecuted все еще работает и ждет 8 секунд на счет, я полагаю, у вас есть 4 счетов для обработки ....

+0

Ну, он должен ждать 8 секунд на счет-фактуру, но я не понимаю, почему он должен ждать намного больше в конце. –

Смежные вопросы