如何在 ASP.NET 核心中使用异步"ForEach"?



. NET Core Web API项目中,我编写了如下接口。第一个请求是正常的,第二个请求将报告错误。应该是我对异步编程了解不够。我不知道为什么会报告错误。我希望朋友能给我一些建议。

[HttpGet("role_claims")]
public async Task<IActionResult> role_claims()
{
// var user = await userManager.GetUserAsync(User);
// var roles = await userManager.GetRolesAsync(user);
List<Claim> claims = new List<Claim>();
var roles = this.User.FindAll(ClaimTypes.Role).ToList();
roles.ForEach(async x => {
MyRole role = await roleManager.FindByNameAsync(x.Value);
IList<Claim> list = await roleManager.GetClaimsAsync(role);
Console.WriteLine($"{x.ValueType} {x.Value} {list.Count}");
list.ToList().ForEach(x => claims.Add(x));
});
return Ok(claims.Select(claim => new { claim.Type, claim.Value }).ToArray());
}

错误信息如下

失败:Microsoft.EntityFrameworkCore.Query [10100]

在对上下文类型'OnePlan.Conf.IdentityDb'的查询结果进行迭代时发生异常。

系统。ObjectDisposedException:无法访问已处置的上下文实例。造成此错误的一个常见原因是,处理从依赖注入中解决的上下文实例,然后试图在应用程序的其他地方使用相同的上下文实例。如果在上下文实例上调用"Dispose"或将其包装在using语句中,可能会发生这种情况。如果你正在使用依赖注入,你应该让依赖注入容器来处理上下文实例。

对象名称:'IdentityDb'.


at microsoft . entityframeworkcore . dbcontext . checkdispose ()
at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
at microsoft . entityframeworkcore . dbcontext . internal . idbcontextdependencies . get_statemanager ()
at microsoft . entityframeworkcore . querycontextdependencies . get_statemanager ()
at Microsoft.EntityFrameworkCore.Query.QueryContextDependencies.get_StateManager()
at Microsoft.EntityFrameworkCore.Query.QueryContext. querycontext . checkdispose ()
at microsoft . entityframeworkcore . querycontext . checkdispose ()
at microsoft . entityframeworkcore . querycontext . checkdispose ()InitializeStateManager(Boolean standAlone)
at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable1.AsyncEnumerator.InitializeReaderAsync(AsyncEnumerator enumerator, CancellationToken cancellationToken) at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func. 4操作,Func4 verifySucceeded, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable. 1.AsyncEnumerator.MoveNextAsync()

这么几行代码就有这么多问题。

从EF上调用ToList()开始。核心(可能?)上下文,你绝对不应该这样做。异步版本负责工作线程之间的任何多线程同步。

那么你正在使用的ForEach函数不支持async调用,或者你会等待它。相反,它所做的是什么都不运行,然后返回你的Ok()结果,然后处置你的上下文,最后实际运行你的代码在ForEach,方式后的上下文被处置,因此你的问题。

在实体上使用常规的foreach,或者编写ForEachAsync扩展函数并在调用中等待它。

最新更新