首页 > 解决方案 > 如何访问包装在 Task<> 中的对象属性?

问题描述

我试图访问 UpdateUser(userModelFromRepo) 中用户的属性,当我更改参数以接受任务时,我无法访问 User.modifiedAt 属性。有没有办法这样做?或者,有没有办法只返回用户对象并与 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;
        });
    }

标签: c#asynchronousasync-await

解决方案


你需要像这样等待电话

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;
}

推荐阅读