Расширение: C # async / await await не ждет
Если последовательно выполняемые методы также сохраняются в списке, как я могу добавить ExecuteParallelAsync к этому списку?
private async Task ExecuteSequential()
{
List<Action> sequentialMethods = new List<Action>()
{
SomeMethod1,
SomeMethod2,
await ExecuteParallelAsync, // ???
SomeMethod3,
SomeMethod4
};
for ( int i = 0 ; i < sequentialMethods.Count ; i++ )
{
sequentialMethods.ElementAt( i ).Invoke();
}
}
Пояснение:
private async Task ExecuteParallelAsync()
{
List<Action> methods = new List<Action>()
{
MyMethod1,
MyMethod2,
MyMethod3
};
await Task.Run( () => { Parallel.ForEach( methods , ( currentMethod ) => currentMethod.Invoke() ); } );
}
sequentialMethods это Список <<em> Действие> , но ExecuteParallelAsync НЕ является действием. Я попытался разделить список, как предложено. К сожалению, это не помогает.
Способ, предложенный Марком из исходного кода, работает нормально. Но я хочу сделать некоторые дополнительные вещи после каждого (последовательного) вызова метода, поэтому я пытаюсь использовать список и цикл вместо простых вызовов методов.
Но когда я делаю это, я 'Я снова сталкиваюсь с исходной проблемой, что SomeMethod3 выполняется до завершения ExecuteParallelAsync.
Еще раз, все в ExecuteParallelAsync может и должно выполняться одновременно. Все в ExecuteSequential должно выполняться последовательно.
Решение:
Габриэль абсолютно прав. Важным утверждением является следующее:
await Task.Run( () => { Parallel.ForEach( methods , ( currentMethod ) => currentMethod.Invoke() ); } );
Когда я удаляю каждую асинхронную и каждую задачу, чтобы все, что должно выполняться, выполнялось последовательно, эта строка является ключом:
Parallel.ForEach( methods , ( currentMethod ) => currentMethod.Invoke() );
Когда яиспользуйте это последнее утверждение, все работает правильно.
Спасибо всем, все ваши идеи, мысли и усилия помогли и приветствуются.