Intereting Posts
Как запустить процесс IIS с определенным именем пользователя и паролем Как поместить условный атрибут Required в свойство classа для работы с WEB API? Общий метод фильтрации объекта списка Обновление пользовательского интерфейса из нескольких рабочих streamов (.NET) Предотrotation веб-API от выполнения AT ALL, если причина EnableCors Origin недействительна ASP.NET MVC привязка модели со списком ListBoxFor & DropDownListFor Helpers Как выполнить необработанный SQL-запрос с использованием Entity Framework без использования модели? Как использовать lambda-выражения для фильтрации DataRows? В C #, Is Expression API лучше, чем Reflection Datatips (наведение мыши на переменные в режиме отладки) не работает в Visual Studio 2012 / Win 7 64bit ASP.NET/C# – определить размер файла с другого сервера? project.Models.tableName: Поле pvid должно быть строковым или массивным типом с максимальной длиной ’20’ Session_End код закрытия браузера Кроме того, имеет сходный эффект с отличием? Как использовать пользовательский IXmlSerializable как XmlAttribute?

Любая точка в List .ForEach () с Async?

Я столкнулся с этим fragmentом кода:

items.ForEach(async item => { doSomeStuff(); await mongoItems.FindOneAndUpdateAsync(mongoMumboJumbo); await AddBlah(SqlMumboJumbo); }); 

Есть ли смысл сделать это делегатом .forEach, или это может быть обычный цикл foreach? Пока функция, содержащая цикл, находится в async, это будет async по умолчанию?

Делегатом, получившим ForEach является Action :

 public void ForEach(Action action) 

Это означает, что любой asynchronous делегат, который вы используете внутри него, эффективно превратится в метод async void . Это стиль исполнения «огонь и забвение». Это означает, что ваш foreach не завершит асинхронное ожидание, прежде чем продолжить вызов делегата в следующем элементе списка, что может быть нежелательным поведением.

Вместо этого используйте обычный foreach .

Side note – foreach VS ForEach от Eric Lippert, отличный пост в блоге.

Вы не знаете, когда ваша функция закончена, или результат функции. Если вы начинаете каждый расчет в отдельной задаче, вы можете ждать Task.WhenAll и интерпретировать результаты, даже исключая исключения:

 private async Task ActionAsync(T item) { doSomeStuff(); await mongoItems.FindOneAndUpdateAsync(mongoMumboJumbo); await AddBlah(SqlMumboJumbo); } private async Task MyFunction(IEnumerable items) { try { foreach (var item in items) { tasks.Add( ActionAsync(item) ) } // while all actions are running do something useful // when needed await for all tasks to finish: await Task.WhenAll(tasks); // interpret the result of each action using property Task.Result } catch (AggregateException exc) { ProcessAggregateException(exc); } } 

Исключение aggregateException возникает, когда любая из ваших задач выдает исключение. If содержит все исключения, брошенные всеми вашими задачами.