Я хотел попробовать Threading.Task (C#), чтобы выполнить некоторую работу параллельно. В этом простом примере у меня есть форма с индикатором выполнения и кнопкой. При щелчке вызывается функция RunParallel. Без Task.WaitAll() он, кажется, проходит через штраф. Однако с выражением WaitAll форма показывает и ничего не происходит. Я не понимаю, что я делаю неправильно в настройке ниже. Спасибо заранее.Task.WaitAll freezes app C#
public partial class MainWindow : Form
{
public delegate void BarDelegate();
public MainWindow()
{
InitializeComponent();
}
private void button_Click(object sender, EventArgs e)
{
RunParallel();
}
private void RunParallel() {
int numOfTasks = 8;
progressBar1.Maximum = numOfTasks;
progressBar1.Minimum = 0;
try
{
List<Task> allTasks = new List<Task>();
for (int i = 0; i < numOfTasks; i++)
{
allTasks.Add(Task.Factory.StartNew(() => { doWork(i); }));
}
Task.WaitAll(allTasks.ToArray());
}
catch { }
}
private void doWork(object o1)
{
// do work...
// then
this.Invoke(new BarDelegate(UpdateBar));
}
private void UpdateBar()
{
if (progressBar1.Value < progressBar1.Maximum) progressBar1.Value++;
}
}
Task.WaitAll является операцией блокировки. Используйте ContinueWith или ContinueWhenAll вместо этого – Dimitri
Вот что WaitAll делает, он блокируется, пока все задачи не закончатся.Задачи не могут быть завершены, потому что Invoke будет запускать свое действие в потоке пользовательского интерфейса, которое уже заблокировано WaitAll –