2013-09-01 3 views
3

У меня есть программа пользовательского интерфейса, которая обновляет элементы с медленной загрузкой. Мне удалось загрузить элементы параллельно и показать каждый элемент, как только он закончит загрузку. Тем не менее, я хочу показать индикатор выполнения при загрузке и скрыть его, как только будут загружены все элементы.Как остановить индикатор выполнения при завершении последней задачи?

private void refreshButton_Click(object sender, EventArgs e) 
{ 
    foreach (var item in Items) 
    { 
     progressBar1.Visible = true; 
     Task.Factory 
      .StartNew(() => DoNonUiwork(item)) 
      .ContinueWith(antedecent => 
      { 
       UpdateUI(antedecent.Result); 
       if (/* if what? */) 
       { 
        progressBar1.Visible = false; 
       } 
      } 
     , TaskScheduler.FromCurrentSynchronizationContext()); 
    } 
} 

я помню все мои задачи и использовать Parallel.WaitAll() на них, но тогда я буду блокировать поток пользовательского интерфейса, который не приятно.

Я мог бы настроить механизм синхронизации доморощенного - возможно, счетчик, который начинается с int itemsToUpdate = Items.Count(), а затем /* if what? */ становится --itemsToUpdate== 0. Он работает, но не чувствует себя очень похожим на задачи ...

Есть ли способ выполнения Заданий?

+0

Просто увеличивайте счетчик при запуске задания, уменьшите его, когда это будет сделано. Когда он достигает 0, PB должен исчезнуть. –

+0

Вы можете использовать обходной путь, как предлагает @HansPassant, но помните, что ваши задачи выполняются в потоках разностей. –

+0

Нет, подсчет гарантированно будет работать в той же теме. Если это не так, то обновление PB также не может работать. –

ответ

2

Вы можете использовать метод Task.WhenAll для этой цели. или используйте TaskFactory.ContinueWhenAll, а затем вы можете настроить маркер на поток пользовательского интерфейса.

0

Поместите свой Parallel.WaitAll() в еще одну задачу.

0

Вы можете попробовать отключить другую задачу, которая выполняет Task.WaitAll() и уведомляет ваш интерфейс после.

0
  1. Создайте родительскую задачу.
  2. Приложите все задачи к родительскому.
  3. В родительском продолжении скрывать индикатор выполнения.
Смежные вопросы