以下示例代码中是否需要async?

时间:2017-06-13 12:06:41

标签: .net asp.net-web-api async-await

我正在使用移动应用程序使用的ASP.Net Web API。我接近了我的同事离开的地方。我对他的方法感到好奇,因为几乎每个函数都使用异步等待。有人可以告诉我以下代码是否需要await db.FirstOrDefault<User>(...)?如果是这样,这有什么好处?

public async Task<Result<User>> GetByUsername(string username)
{
    using (ILoggingContext logger = CreateLogContext("GetByUsername"))
    {
        try
        {
            using (var db = new DbContext())
            {
                var record = await db.FirstOrDefault<User>("SELECT * FROM " + DomainName + " where username = '" + username + "'");
                if (record == null)
                {
                    return new LResult<User>("Unable to found " + DataName.ToLower(), logger, username);
                }

                return new LResult<User>(record);
            }

        }
        catch (Exception e)
        {
            logger.Error(e, username);
            return LResult<User>.DefaultError;
        }
    }
}

public async Task<Result> ResetPassword(string username, string password)
{
    using (var logger = CreateLogContext("ResetPassword"))
    {
        try
        {
            var getProfileRes = await GetProfileByUsername(username);
            if (!getProfileRes.Successful)
            {
                return new Result("Invalid username");
            }
            var profile = getProfileRes.Data;

            var getMembershipRes = await GetMembershipByProfileId(profile.UserId);
            if (!getMembershipRes.Successful)
            {
                logger.Warning("Unable to found membership", profile.UserId);
                return Result.DefaultError;
            }

            var membership = getMembershipRes.Data;
            membership.Password = PasswordHelper.Create(password);
            membership.PasswordFailuresSinceLastSuccess = 0;
            membership.PasswordChangedDate = DateTime.UtcNow;
            return await UpdateMembership(membership);
        }
        catch (Exception e)
        {
            logger.Error(e);
            return LResult.DefaultError;
        }
    }
}

在控制器中:

[HttpPost]
[Route("api/user/resetpassword")]
public async Task<IHttpActionResult> ResetPassword([FromBody]Login request)
{
    return Ok(await _da.ResetPassword(request.Username,request.Password));
}

据我所知,数据库操作正在一个单独的线程上执行,但我们仍在等待它。在它下面的代码中,它检查null。使用普通同步方法有什么区别?

另外,我对return Ok(await...)部分非常好奇。

1 个答案:

答案 0 :(得分:4)

我建议你阅读我的intro to async ASP.NET文章,特别是上半部分。

总之,异步方法通过释放线程来工作。在服务器端,这可以实现更好的可扩展性,因为您使用更少的资源来响应更多请求。

从某种意义上说,异步与并行性非常相似 - 它们都是并发形式(一次做多件事)。在另一种意义上,异步与并行性相反 - 异步是关于使用更少的线程,并行性是关于使用更多线程。