.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

猜你喜欢

转载自blog.csdn.net/LZD_jay/article/details/125549288