Bar*_*ham 5 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);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是以下两行的表现非常令人失望
userManager.Create(newUser) -- (900 milliseconds)
userManager.GeneratePasswordResetToken(newUser.Id) --(1800 milliseconds)
Run Code Online (Sandbox Code Playgroud)
大量,即2000个用户,性能成为一个严重的问题.加速这个过程有更好的做法吗?我愿意接受建议,但我必须保留OwinContext库.
提前致谢
您可以尝试在并行中创建用户,这可能会加快总体时间,但是存在一个问题:
Create对和 的调用GeneratePasswordResetToken很慢,因为它们调用数据库并行执行工作会增加对数据库的并发调用数量,可能会进一步减慢数据库速度,这实际上取决于托管数据库的硬件有多好。
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);
}
})
Run Code Online (Sandbox Code Playgroud)