【发布时间】:2017-06-13 12:06:41
【问题描述】:
我正在开发一个供移动应用程序使用的 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));
}
据我了解,数据库操作正在单独的线程上执行,但我们仍在等待它。在它下面的代码中,它正在检查空值。仅使用普通同步方法有什么区别?
另外,我对return Ok(await...) 部分非常好奇。
【问题讨论】:
-
不,数据库操作不一定是“在单独的线程上执行”,
await也不是“还在等待”。使用 async / await 进行异步编程是一个很大的主题,它不是有人可以在 stackoverflow 答案中快速向您解释的东西。从这里开始阅读:msdn.microsoft.com/library/hh191443(vs.110).aspx -
谢谢迈克。我过去做过一些多线程,但主要是在 Windows 窗体上,以阻止进程阻塞我的 GUI。我很好奇的是,async-await 在 web api 中的含义是什么。并感谢您的链接:)
标签: .net asp.net-web-api async-await