.net core 使用异步等待(Async-await)在Foreach中提示“连接不支持 MultipleActiveResultSets”

问题:

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

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值