C# 用户管理器CreateAxync运行速度非常慢-标识2
我运行此查询是为了使用entity framework和Microsoft的Identity 2将旧MySQL数据库的使用导入到新的SQL数据库,并且在本地服务器上Visual Studio Community edition与SQL server 10.0.5一起运行 用户管理员声明C# 用户管理器CreateAxync运行速度非常慢-标识2,c#,asp.net-mvc-5,entity-framework-6,asp.net-identity-2,C#,Asp.net Mvc 5,Entity Framework 6,Asp.net Identity 2,我运行此查询是为了使用entity framework和Microsoft的Identity 2将旧MySQL数据库的使用导入到新的SQL数据库,并且在本地服务器上Visual Studio Community edition与SQL server 10.0.5一起运行 用户管理员声明 private ApplicationUserManager _userManager; public ApplicationUserManager UserManager { get {
private ApplicationUserManager _userManager;
public ApplicationUserManager UserManager
{
get
{
if (_userManager == null)
{
this._userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
this._userManager.PasswordValidator = new CustomPasswordValidator();
}
return _userManager;
}
private set
{
_userManager = value;
}
}
private ApplicationUserManager\u userManager;
公共应用程序管理员用户管理器
{
得到
{
如果(_userManager==null)
{
这是._userManager=HttpContext.GetOwinContext().GetUserManager();
这是._userManager.PasswordValidator=新的CustomPasswordValidator();
}
返回用户管理器;
}
专用设备
{
_userManager=value;
}
}
控制器方法-sql和MySQL工作单元位于控制器构造中,整个过程中每个db只生成一个上下文
公共异步任务索引()
{
等待输入者();
返回视图();
}
专用异步任务导入器()
{
DateTime timeNow=DateTime.Now;
//在大约一毫秒内返回旧用户的完整列表
列表用户=
这是mySQLUnitOfWork
.MySQLRepo
.GetUsers()
.ToList();
foreach(用户中的var用户)
{
如果(user.username!=null&&user.email!=null&&
user.username!=“”&&user.email!=“”&&
UserManager.FindByEmail(user.email)==null)
{
默认_配置文件=
这是mySQLUnitOfWork
.MySQLRepo
.GetProfiles()
.其中(x=>
x、 id==user.id
).FirstOrDefault();
if(profile!=null)
{
var newUser=newapplicationuser{
UserName=user.UserName.ToLower(),
Email=user.Email.ToLower(),
CreatedAt=timeNow,
UpdatedAt=timeNow
};
newUser.Profile=newuserprofile{
CreatedAt=timeNow,
UpdatedAt=timeNow,
FirstName=profile.first\u name,
LastName=profile.last_name,
用户=新用户
};
//要花很长时间才能完成
var result=await UserManager.CreateAsync(
新用户,
Guid.NewGuid().ToString(“N”)
);
if(result.successed)
{
UserManager.AddToRole(newUser.Id,RoleChoices.MEMBER);
var dbUser=this.sqlUnitOfWork.UserRepository.GetByID(newUser.Id);
}
}
}
}
返回true;
}
问题:
对于2000条用户记录,此操作至少需要45分钟。CreateAsync和AddToRole方法似乎需要很长时间才能运行。为什么会这样
注意:
我一直在调试这个程序。。。最慢的部分是等待CreateAsync方法完成。。。真的很奇怪?创建一个用户至少需要1秒。看起来您并没有破坏您的上下文/存储库,如果您让存储库在整个应用程序范围内保持活动状态,它的大小将会增加。这是一种不好的做法,通常存储库应该只与请求生命周期共存,它应该在新请求开始时创建,并在请求完成时进行处理。分析代码。有异步代码的分析器吗?如果不暂停调试器10次,看看最常出现在堆栈上的是什么。我将查看分析,谢谢你的提示。@Jimmyt1988我目前遇到了相同的问题。您找到解决此问题的方法了吗?@Jimmyt1988您找到解决方案了吗?我在这里遇到了同样的问题。这一切都发生在一个控制器内。。。因此,这是一个请求。上下文是在工作单元中我的控制器的构造中创建的,然后在控制器生命周期结束时删除,因此一旦控制器方法完成它的过程,我的内存就会恢复正常。您是否认为我删除了上下文并在创建每个用户的每个循环中重新生成它?它似乎不正确。此ApplicationUserManager从HttpContext.GetOwinContext()接收的位置和方式。GetUserManager是否已销毁?
public async Task<ActionResult> Index()
{
await ImportUsers();
return View();
}
private async Task<bool> ImportUsers()
{
DateTime timeNow = DateTime.Now;
// Returns a full list of old users in about a millisecond
List<default_users> users =
this.mySQLUnitOfWork
.MySQLRepo
.GetUsers()
.ToList();
foreach (var user in users)
{
if (user.username != null && user.email != null &&
user.username != "" && user.email != "" &&
UserManager.FindByEmail(user.email) == null)
{
default_profiles profile =
this.mySQLUnitOfWork
.MySQLRepo
.GetProfiles()
.Where(x =>
x.id == user.id
).FirstOrDefault();
if (profile != null)
{
var newUser = new ApplicationUser {
UserName = user.username.ToLower(),
Email = user.email.ToLower(),
CreatedAt = timeNow,
UpdatedAt = timeNow
};
newUser.Profile = new UserProfile {
CreatedAt = timeNow,
UpdatedAt = timeNow,
FirstName = profile.first_name,
LastName = profile.last_name,
User = newUser
};
// Takes ages to complete
var result = await UserManager.CreateAsync(
newUser,
Guid.NewGuid().ToString("N")
);
if (result.Succeeded)
{
UserManager.AddToRole(newUser.Id, RoleChoices.MEMBER);
var dbUser = this.sqlUnitOfWork.UserRepository.GetByID(newUser.Id);
}
}
}
}
return true;
}