Как я могу получить доступ к свойствам объектов, заключенных в Task <>? - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь получить доступ к свойству пользователя в UpdateUser (userModelFromRepo), когда я изменяю параметры для принятия задачи, я не могу получить доступ к свойству User.modifiedAt. Как это сделать? В качестве альтернативы, есть ли способ просто вернуть объект пользователя обратно и остаться asyn c из GetUserById ()? await _repository.UpdateUser (userModelFromRepo) говорит, что он не может преобразовать из пользователя задачи в пользователя.

    [HttpPut("{id}")]
    public async Task<ActionResult> UpdateUser(int id, UserUpdateDto userUpdateDto)
    {
        var userModelFromRepo = _repository.GetUserById(id);
        if (userModelFromRepo == null)
        {
            return NotFound();
        }

        await _mapper.Map(userUpdateDto, userModelFromRepo);
        await _repository.UpdateUser(userModelFromRepo);
        await _repository.SaveChanges();

        return NoContent();
    }

    public async Task<User> GetUserById(int id)
    {
        return await _context.User.FirstOrDefaultAsync(u => u.Id == id);
    }

    public async Task UpdateUser(User userModelFromRepo)
    {
        await Task.Run(() =>
        {
            if (user == null)
            {
                throw new ArgumentNullException(nameof(user));
            }
            user.ModifiedAt = DateTime.UtcNow;
        });
    }

1 Ответ

3 голосов
/ 05 августа 2020

Вам нужно дождаться такого вызова

var userModelFromRepo =  await _repository.GetUserById(id);

Полный код:

[HttpPut("{id}")]
public async Task<ActionResult> UpdateUser(int id, UserUpdateDto userUpdateDto)
{
    var userModelFromRepo =  await _repository.GetUserById(id);
    if (userModelFromRepo == null)
    {
        return NotFound();
    }

    await _mapper.Map(userUpdateDto, userModelFromRepo);
    await _repository.UpdateUser(userModelFromRepo);
    await _repository.SaveChanges();

    return NoContent();
}

Кроме того, если вы ничего не делаете в своем методе UpdateUser, вы можете удалить Task.Run, ничего не добавляет.

public Task UpdateUser(User userModelFromRepo)
{
        if (user == null)
        {
            throw new ArgumentNullException(nameof(user));
        }
        user.ModifiedAt = DateTime.UtcNow;
        return Task.CompletedTask;
}
...