Как сделать задержку с проверкой перед добавлением данных в ASP.NET

Рейтинг: 0Ответов: 1Опубликовано: 06.05.2023

Как сделать задержку перед добавлением новых данных в ASP.NET Core с целью отмены записи этих данных, если во время задержки поступит запрос на добавление таких же данных?

Сценарий должен быть такой: передаем в метод нового юзера, проходим проверку на null. А дальше нужна задержка на 5 сек. и если за 5 сек. будет попытка добавления юзера с таким же логином, то не добавляем ничего, иначе добавляем юзера в БД. При этом эта задержка не должна мешать добавлять других юзеров.

Пытался применить здесь класс Task и CancellationToken, но в многопоточным программированием не силен, не разобрался.

        [HttpPost]
        public async Task<ActionResult<User>> AddUser(User user)
        {
            if (user == null)
                return BadRequest();
            db.Users.Add(user);
            await db.SaveChangesAsync();
            return Ok();
        }

Ответы

▲ 0

Я нашел подходящее для себя решение. Создал статический класс, который использую как глобальную переменную и в нем же проверяю попытку регистрации одинаковых логинов. Вот этот класс:

public static class UserHelper
{
    static List<string> logins = new List<string>();
    public static void Add(string login)
    {
        logins.Add(login);
    }
    public static bool Check(string login)
    {
        return logins.Where(x => x.Equals(login)).Count() > 1;
    }
    public static void Clear()
    {
        logins.Clear();
    }
}

И измененный метод добавления нового пользователя:

    [HttpPost]
    public async Task<ActionResult<User>> AddUser(User user)
    {
        if (user == null)
            return BadRequest();
        UserHelper.Add(user.Login);
        await Task.Delay(5000);
        if (UserHelper.Check(user.Login))
            return BadRequest("Attempt to create more than one user with the same username");
        db.Users.Add(user);
        await db.SaveChangesAsync();
        UserHelper.Clear();
        return Ok();
    }