Чтобы превратить след комментария в ответ:
Метод
private async Task<string> SetTextbox(int delaySeconds)
{
Thread.Sleep(delaySeconds * 1000);
return "Done.";
}
совсем не асин c. Он никогда не выдаст поток (не ожидает), и вы должны увидеть предупреждение компилятора, которое пытается сообщить вам, что:
CS1998 Этот асин c метод не имеет операторов "ожидание" и будет работать синхронно. ...
И я предполагаю, что Thread.Sleep () специально предназначен для имитации синхронной (интенсивной загрузки ЦП) работы.
Немного лучше будет вариант:
private Task<string> SetTextbox(int delaySeconds)
{
Thread.Sleep(delaySeconds * 1000);
return Task.FromResult( "Done.");
}
это избавляет от предупреждения и позволяет избежать некоторых накладных расходов. Но это все еще вводит в заблуждение и использует неправильный подход.
Вариант, который лучше всего подходит к ситуации, просто
private string SetTextbox(int delaySeconds)
{
Thread.Sleep(delaySeconds * 1000);
return "Done.";
}
выполнение этого асинхронного c - это вопрос формы, а не сам метод. Это не асин c, у него нет ожидаемых частей.
Вы называете это так, когда хотите, чтобы они запускались последовательно:
label1.Text = await Task.Run(() => SetTextbox(1));
label2.Text = await Task.Run(() => SetTextbox(2));
label3.Text = await Task.Run(() => SetTextbox(3));
Это занимает 1 + 2 + 3 секунды, но ваша форма остается интерактивной, и вы видите, что «Готово» появляется через определенные промежутки времени. .
Чтобы выполнить их параллельно, на это уже был дан ответ, но вы можете устранить один слой async / await:
var task1 = Task.Run(() => SetTextbox(1));
var task2 = Task.Run(() => SetTextbox(2));
var task3 = Task.Run(() => SetTextbox(3));
await Task.WhenAll(task1, task2, task3);
label1.Text = await task1;
label2.Text = await task2;
label3.Text = await task3;
, это, конечно, займет всего 3 секунды.