我正在使用移动应用程序使用的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...)
部分非常好奇。
答案 0 :(得分:4)
我建议你阅读我的intro to async ASP.NET文章,特别是上半部分。
总之,异步方法通过释放线程来工作。在服务器端,这可以实现更好的可扩展性,因为您使用更少的资源来响应更多请求。
从某种意义上说,异步与并行性非常相似 - 它们都是并发形式(一次做多件事)。在另一种意义上,异步与并行性相反 - 异步是关于使用更少的线程,并行性是关于使用更多线程。