2015-06-09 71 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