2015-06-09 30 views
4

我上传包含所有需要的用户到使用ASP.NET身份和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

一件事你重新获得你的循环的UserManager内部。这真的有必要吗?我没有看过代码,但如果发生任何延迟加载,它可能会减慢速度。 –

+0

谢谢大卫。它帮助了很多。我还为整个上传块使用了一个Context对象,它也提高了性能。现在它在大约20分钟内加载2000条记录。任何其他想法? – Barsham

+0

花了一些时间来查看源代码后,如果您使用ApplicationUserManager时发生死亡,我认为您运气不佳。没有任何东西支持任何类型的链接上下文或批处理用户创建。你最好的选择可能是某种并行化(如下面的建议),尽管这可能不一定会给你带来更好的结果。 –

回答

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); 
    
        } 
    }) 
    
+0

感谢Mike,我曾考虑过Parallel,不幸的是OwinContext和EF6对多线程不是很满意,或者我做错了! – Barsham