Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在OwinContext中批量创建用户(性能)_C#_Asp.net_Identity_Bulk - Fatal编程技术网

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

C# 在OwinContext中批量创建用户(性能),c#,asp.net,identity,bulk,C#,Asp.net,Identity,Bulk,我正在使用ASP.NET标识、OWINCOTEXT和EF 6将包含所有必需用户的excel文件上载到我的网站。 我的代码如下所示: foreach (var bulkUserDetail in bulkUser.BulkUserDetails) { var userManager = owinContext.GetUserManager<ApplicationUserManager>(); var userProfile = new UserPro

我正在使用ASP.NET标识、OWINCOTEXT和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);

        }

}
在大量(即2000个用户)中,性能成为一个严重的问题。 有没有更好的方法来加速这个过程?我愿意接受建议,但我必须保留文本库


提前感谢

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

  • 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);
    
        }
    })
    
    var userManager=owinContext.GetUserManager();
    Parallel.ForEach(bulkUser.BulkUserDetails,BulkUserDetails=>
    {       
    //您真的需要将此userProfile设置为未使用吗
    var userProfile=new userProfile();
    userProfile.Username=bulkUserDetail.Username;
    AspNetUser newUser=新AspNetUser
    {
    UserName=userProfile.UserName,
    Email=bulkUserDetail.Email,
    LastPasswordChangedDate=null,
    };
    var creationResult=userManager.Create(newUser);
    如果(creationResult.Successed)
    {
    string token=userManager.GeneratePasswordResetToken(newUser.Id);
    }
    })
    

首先,您将用户管理器置于您的循环中。这真的有必要吗?我没有看过代码,但是如果有任何延迟加载发生,它可能会减慢速度。谢谢David。这很有帮助。我还为整个上传块使用了一个上下文对象,这也提高了性能。现在,它在大约20分钟内加载2000条记录。还有其他想法吗?在花了一些时间查看源代码之后,我认为如果你死心塌地地使用ApplicationUserManager,那你就不走运了。没有任何东西支持任何类型的链接上下文或批量用户创建。您最好的选择可能是某种并行化(如下面建议的),尽管这不一定会给您带来更好的结果。谢谢Mike,我以前考虑过并行,不幸的是OwinContext和EF6对多线程不是很满意,或者可能是我做错了!
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);

    }
})