【问题标题】:Is async await necessary in the following sample code? [closed]以下示例代码中是否需要异步等待? [关闭]
【发布时间】: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


【解决方案1】:

我建议你阅读我的intro to async ASP.NET 文章,尤其是前半部分。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 2013-09-16
    相关资源
    最近更新 更多