问题:
使用数组集合的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