【发布时间】:2015-02-24 08:43:13
【问题描述】:
我已经看到了,但是我遇到了另一个问题。
我有这个用于管理 ASP.NET 身份角色的服务类:
public class RoleService : IRoleService
{
private readonly RoleManager<ApplicationRole> _roleManager;
public RoleService(RoleManager<ApplicationRole> roleManager)
{
this._roleManager = roleManager;
}
public async Task<IdentityResult> CreateAsync(ApplicationRole role)
{
return await this._roleManager.CreateAsync(role);
}
}
按照this question的建议,我使用CreateAsync这样的方法来避免使用LINQ foreach:
private async Task PopulateRoles()
{
var roles = new[] { "A", "B", "C", "D" };
// Used LINQ foreach previously but I coded this way instead to follow the related questions's answer
var tasks = roles.Select(role =>
this._roleService.CreateAsync(new ApplicationRole(role)))
.ToList();
await Task.WhenAll(tasks);
}
但是,这会在执行await this.PopulateRoles() 时导致错误。
实体框架:已经有一个打开的 DataReader 与此命令关联,必须先关闭。
搜索此错误只会导致我建议在我的 Select LINQ 中添加 ToList()。我该如何解决?
【问题讨论】:
-
RoleManager实例不是线程安全的。多个CreateAsync任务正在争夺同一个连接。您应该以传统的串行方式执行此操作。 -
我会以同步方式创建角色吗?
-
是的,这就是我的建议。
-
感谢您的建议。我会等待其他人的评论(如果还有的话:D)
-
如果您只有一个
RoleManager实例,您将无法同时创建多个用户。这是一个问题吗?你能简单地使用foreach和await来迭代它们吗?
标签: c# .net entity-framework asynchronous async-await