Ускорение цикла в консольном приложении, использующем EF и ASP.NET Метод AddPasswordAsync идентификатора AddPasswordAsync

#c# #entity-framework #console-application #asp.net-identity

#c# #сущность-фреймворк #консольное приложение #asp.net-идентификация #entity-framework #asp.net-identity

Вопрос:

У меня есть консольное приложение на C #, в котором я использую ASP.NET Идентификатор AddPasswordAsync для хэширования паролей в моей базе данных MSSQL. У меня есть около 50 000 записей для обновления. Я запускаю его в своей тестовой базе данных, и это занимает целую вечность.

Есть ли способ ускорить это?

 foreach (var user in db.Member.Where(u => u.is_deleted == false).Select(u => new { id = u.id, pass = u.web_password, hash = u.password_hash }).ToList())
            {
                if (user.hash == null)
                {
                    if (user.pass == null)
                    {
                        string newPass = RandomString(8);

                        var result = userManager.AddPasswordAsync(user.id, newPass).Resu<
                        Console.WriteLine(
                            "UserID: {0}, Password: {1}, Hashed: {2}",
                            user.id,
                            newPass,
                           result.Succeeded);
                    }
                    else
                    {
                        var result = userManager.AddPasswordAsync(user.id, user.pass).Resu<
                        Console.WriteLine(
                            "UserID: {0}, Password: {1}, Hashed: {2}",
                            user.id,
                            user.pass,
                           result.Succeeded);
                    }
                }
            }
  

Комментарии:

1. Возможно, параллельный. Цикл foreach может помочь вам вместо использования обычного цикла foreach.

2. Спасибо за этот совет, @Horizon. Я не смог вернуться к этому, но я понятия не имел о параллели. ForEach. Я обязательно попробую.

Ответ №1:

Может быть что-то вроде (при условии, что AddPasswordAsync заполняет столбец хэша):

     int i = 500;    
    while ( i > 0) {
        i = 0;
        foreach (var user in db.Member.Where(u => u.is_deleted == false amp;amp; u.hash == null).Select(u => new { id = u.id, pass = u.web_password, hash = u.password_hash }).Take(500).ToList())
        {
           i  ;
                if (user.pass == null)
                {
                    string newPass = RandomString(8);

                    var result = userManager.AddPasswordAsync(user.id, newPass).Resu<
                    Console.WriteLine(
                        "UserID: {0}, Password: {1}, Hashed: {2}",
                        user.id,
                        newPass,
                       result.Succeeded);
                }
                else
                {
                    var result = userManager.AddPasswordAsync(user.id, user.pass).Resu<
                    Console.WriteLine(
                        "UserID: {0}, Password: {1}, Hashed: {2}",
                        user.id,
                        user.pass,
                       result.Succeeded);
                }
            }
    }