问题:
使用数组集合的ForEach方法在Lambda中进行异步(Async)批量更新操作实体对象时,更新失败抛出错误:“The connection does not support MultipleActiveResultSets” 错误信息。
代码片段:
- demand.Characters.ForEach(async type =>
- {
- var userCharacterDemand = new UserCharacterDemandEntity
- {
- Character = type,
- User = user
- };
- await Context.UserCharacterDemands.AddAsync(userCharacterDemand);
- });
该代码为列表中的每个项目启动一个任务,但不会等待每个任务完成后再启动下一个任务。
这相当于:
- foreach (var type in demand.Characters)
- {
- var userCharacterDemand = new UserCharacterDemandEntity
- {
- Character = type,
- User = user
- };
- Context.UserCharacterDemands.Add(userCharacterDemand);
- }
原因:
ForEach 不是一个异步方法。它不会等待由Lambda返回的Task。执行ForEach循环将触发每项任务时并不等待完成任何任务。
问题要点:
将一个Lambda标记为Async并不会使您传递给它的同步方法具有异步行为。
解决方案一:(推荐)
需要使用foreach循环,等待任务完成。
例如:
foreach(var x in xy) await f(x);
- foreach (var type in demand.Characters)
- {
- var userCharacterDemand = new UserCharacterDemandEntity
- {
- Character = type,
- User = user
- };
- await Context.UserCharacterDemands.AddAsync(userCharacterDemand);
- }
解决方案二:
需要在连接字符串中添加属性 MultipleActiveResultSets 并将其设置为 true,以允许多个活动结果集。
详情查看官方说明:
Enabling Multiple Active Result Sets - ADO.NET | Microsoft Docs