У меня есть программа пользовательского интерфейса, которая обновляет элементы с медленной загрузкой. Мне удалось загрузить элементы параллельно и показать каждый элемент, как только он закончит загрузку. Тем не менее, я хочу показать индикатор выполнения при загрузке и скрыть его, как только будут загружены все элементы.Как остановить индикатор выполнения при завершении последней задачи?
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, PB должен исчезнуть. –
Вы можете использовать обходной путь, как предлагает @HansPassant, но помните, что ваши задачи выполняются в потоках разностей. –
Нет, подсчет гарантированно будет работать в той же теме. Если это не так, то обновление PB также не может работать. –