Это один из моих лучших результатов поиска и до сих пор нет примера прогресса в Task Parallel Library
прямо здесь ...
Сегодня я только что наткнулся на TPL, потому что хочу разработать новое многопоточное приложение, но без использования BackgroundWorker
(потому что я где-то читал о задаче с хорошим кодом)
Я скомпилировал пример из ответа @Stephen Cleary, его ссылка довольно сложна для поиска прогресса и некоторых других сайтов.
Это очень простой пример того, как сделать Прогресс и Завершено безопасным для UI способом:
TaskScheduler currentTaskScheduler = TaskScheduler.FromCurrentSynchronizationContext();
Task<string>.Factory.StartNew(() =>
{
// loop for about 10s with 10ms step
for (int i = 0; i < 1000; i++)
{
Thread.Sleep(10);
Task.Factory.StartNew(() =>
{
// this is a task created each time you want to update to the UI thread.
this.Text = i.ToString();
}, CancellationToken.None, TaskCreationOptions.None, currentTaskScheduler);
}
return "Finished!";
})
.ContinueWith(t =>
{
// this is a new task will be run after the main task complete!
this.Text += " " + t.Result;
}, currentTaskScheduler);
Код будет отображать от 1 до 1000 в течение 10 секунд, а затем добавить «Готово!» строка в строке заголовка окна формы. Вы можете видеть, что TaskScheduler - хитрый способ создания безопасного обновления потока пользовательского интерфейса, поскольку я думаю, что задача запланирована для запуска в основном потоке.