這個問題在這里已經有了答案: 如何將異步與 ForEach 一起使用? (10 個回答) 22 小時前關閉。
在 ASP.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”的查詢結果時發生例外。
System.ObjectDisposedException:無法訪問已釋放的背景關系實體。此錯誤的一個常見原因是釋放從依賴注入中決議的背景關系實體,然后嘗試在應用程式的其他地方使用相同的背景關系實體。如果您在背景關系實體上呼叫“Dispose”或將其包裝在 using 陳述句中,則可能會發生這種情況。如果你使用依賴注入,你應該讓依賴注入容器負責處理背景關系實體。
物件名稱:'IdentityDb'。
在 Microsoft.EntityFrameworkCore.DbContext.CheckDisposed()
在 Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
在 Microsoft.EntityFrameworkCore.DbContext.Microsoft.EntityFrameworkCore.Internal.IDbContextDependencies.get_StateManager()
在 Microsoft.EntityFrameworkCore.Query.QueryContextDependencies.get_StateManager()
在 Microsoft.EntityFrameworkCore.Query.QueryContext.InitializeStateManager(Boolean standAlone)
在 Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable1.AsyncEnumerator.InitializeReaderAsync(AsyncEnumerator enumerator, CancellationToken cancellationToken) at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.ExecuteAsync[TState,TResult](TState state, Func4 操作,Func4 verifySucceeded, CancellationToken cancellationToken) at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable1.AsyncEnumerator.MoveNextAsync()
uj5u.com熱心網友回復:
對于這么幾行代碼,你有大量的問題。
從呼叫ToList()EF.Core(可能?)背景關系開始,你絕對不應該這樣做。異步版本負責作業執行緒之間的任何多執行緒同步。
那么ForEach您正在使用的該功能不支持async呼叫,或者您正在等待它。相反,它實際上什么都不運行,然后回傳你的Ok()結果,然后處理你的背景關系,最后ForEach在背景關系被處理之后實際運行你的代碼,這就是你的問題。
要么在你的物體上使用常規foreach,要么撰寫一個ForEachAsync擴展函式并在你的呼叫中等待它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/485186.html
上一篇:出現Azure錯誤:IDW10203:“范圍”或“scp”宣告不包含范圍“access_as_machine”或未找到
下一篇:將下拉串列與值而非鍵進行比較
