Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异步方法上的C#实体框架错误_C#_.net_Entity Framework_Asynchronous_Async Await - Fatal编程技术网

异步方法上的C#实体框架错误

异步方法上的C#实体框架错误,c#,.net,entity-framework,asynchronous,async-await,C#,.net,Entity Framework,Asynchronous,Async Await,我已经看到了这一点,但我遇到了另一个问题 我有此服务类用于管理ASP.NET标识角色: public class RoleService : IRoleService { private readonly RoleManager<ApplicationRole> _roleManager; public RoleService(RoleManager<ApplicationRole> roleManager) { this._ro

我已经看到了这一点,但我遇到了另一个问题

我有此服务类用于管理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);
    }
}
但是,当执行
等待时,这会导致错误。PopulateRoles()

实体框架:已经有一个与此命令关联的打开的DataReader,必须先关闭它


搜索此错误只会导致我建议在我的Select LINQ中添加一个
ToList()
。如何修复它?

问题在于
角色管理器
,它在内部被赋予一个
DbContext
,我们可以看到:


这样,虽然您没有同时应用所有角色的好处,但仍然可以利用IO调用的异步特性,而不是阻塞同步调用。

RoleManager
实例不是线程安全的。多个
CreateAsync
任务正在争夺同一连接。你应该用传统的串行方式来完成。我将以同步方式创建角色?是的,这就是我的建议。谢谢你的建议。我将等待其他人的评论(如果还有:D)如果您只有一个
rolemager
实例,您将无法同时创建多个用户。这是个问题吗?您可以简单地使用
foreach
wait
对它们进行迭代吗?
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);
}
public class RoleStore<TRole, TContext, TKey> : 
        IQueryableRoleStore<TRole>, 
        IRoleClaimStore<TRole>
        where TRole : IdentityRole<TKey>
        where TKey : IEquatable<TKey>
        where TContext : DbContext
{
    public RoleStore(TContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        Context = context;
    }
}
private async Task PopulateRoles()
{
     var roles = new[] { "A", "B", "C", "D" };

     foreach (var role in roles)
     {
         await _roleService.CreateAsync(new ApplicationRole(role));
     }
}