OwinContext中的批量用户创建(性能)

时间:2015-06-09 06:15:55

标签: c# asp.net identity bulk

我使用ASP.NET Identity和OwinContext以及EF 6将包含所有必需用户的excel文件上传到我的网站。 我的代码如下所示:

foreach (var bulkUserDetail in bulkUser.BulkUserDetails)
{

        var userManager = owinContext.GetUserManager<ApplicationUserManager>();

        var userProfile = new UserProfile();

        userProfile.Username = bulkUserDetail.Username;


        AspNetUser newUser = new AspNetUser
        {
            UserName = userProfile.Username,
            Email = bulkUserDetail.Email,
            LastPasswordChangedDate = null,
        };

        var creationResult = userManager.Create(newUser);

        if (creationResult.Succeeded)
        {

            string token = userManager.GeneratePasswordResetToken(newUser.Id);

        }

}

问题是以下两行的表现非常令人失望

userManager.Create(newUser) -- (900 milliseconds)
userManager.GeneratePasswordResetToken(newUser.Id)      --(1800 milliseconds)

大量,即2000个用户,性能成为一个严重的问题。 加速这个过程有更好的做法吗?我愿意接受建议,但我必须保留OwinContext库。

提前致谢

1 个答案:

答案 0 :(得分:0)

你可以尝试在并行内部进行用户创建,这可能会加快整体时间,但是这有一个问题:

  • CreateGeneratePasswordResetToken的调用很慢,因为他们调用数据库
  • 并行执行工作会增加对数据库的并发调用次数,这可能会进一步降低速度,这实际上取决于托管数据库的硬件有多好。

    var userManager = owinContext.GetUserManager<ApplicationUserManager>();
    
    Parallel.ForEach (bulkUser.BulkUserDetails, bulkUserDetail => 
    {       
        //Do you really need to make this userProfile as its not used
        var userProfile = new UserProfile();
    
        userProfile.Username = bulkUserDetail.Username;
    
        AspNetUser newUser = new AspNetUser
        {
            UserName = userProfile.Username,
            Email = bulkUserDetail.Email,
            LastPasswordChangedDate = null,
        };
    
        var creationResult = userManager.Create(newUser);
    
        if (creationResult.Succeeded)
        {
    
            string token = userManager.GeneratePasswordResetToken(newUser.Id);
    
        }
    })