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

本文关键字:用户 性能 OwinContext 创建 | 更新日期: 2023-09-27 17:54:36

我正在上传一个excel文件,其中包含所有需要的用户使用ASP进入我的网站。. NET Identity和OwinContext以及EF 6。我的代码如下所示:

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库。

Thanks in advance

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

您可以尝试在并行中创建用户,这可能会加快总体时间,但是存在一个问题:

  • 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);
        }
    })