У меня есть следующий код: синхронногоПреобразование цикла к задачам
foreach (var step in result) {
step.Run();
}
Я попытался преобразовать его задачи, но я не в состоянии сделать это. Я попытался преобразовать его с помощью Task.WhenAll
, как это (и я добавить асинхр к подписи метода):
var tasks = new List<Task>();
foreach (var step in result) {
tasks.Add(new Task(() => step.Run()));
}
await Task.WhenAll(tasks);
Это возвращает немедленно и не выполняет метод Run()
. Затем я попытался преобразовать его в следующий код:
var tasks = new List<Task>();
foreach (var step in result) {
tasks.Add(new Task(() => step.Run()));
}
var task = Task.WhenAll(tasks);
task.Wait();
Это блокировка навсегда. Тем не менее, когда я создаю внутри цикла он работает:
foreach (var step in result) {
var t = Task.Run(() => step.Run());
t.Wait();
}
Если я использую вместо await Task.Run(() => step.Run());
он ждет только первый и возобновляет основной поток.
Прогон выглядит следующим образом:
public async void Run() {
var result = Work();
if (null != result && result.Count > 0) {
var tasks = new List<Task>();
foreach (var step in result) {
await Task.Run(() => step.Run());
}
}
}
Все этапы реализации способа работы() (который является абстрактным в базовом классе). Мой первый шаг выглядит следующим образом:
class NoWorkStep : WorkerStep {
protected override IList<WorkerStep> Work() {
Console.WriteLine("HERE");
List<WorkerStep> newList = new List<WorkerStep>();
for (int i = 0; i < 10; i++) {
newList.Add(new NoWorkStep2());
}
return newList;
}
}
И мой второй шаг выглядит следующим образом:
class NoWorkStep2 : WorkerStep {
protected override IList<WorkerStep> Work() {
Console.WriteLine("HERE-2");
return new List<WorkerStep>();
}
}
я просто создать экземпляр NoWorkStep и вызвать instance.Run()
.
Где у меня проблема с выполнением шагов с помощью Task.WhenAll
?
Edit: Вызов кода после того, как я изменил метод Run для async Task RunAsync
:
private static async void doIt() {
var step = new NoWorkStep();
await step.RunAsync();
}
async _void_ Run()? – Ewan
Не используйте 'new Task'. Причина, по которой ваш четвертый пример работает, заключается не в том, что 'Wait' находится внутри цикла - он работает, потому что вы используете' Task.Run' вместо 'new Task'. – Luaan