异步方法等待

时间:2014-01-25 16:19:42

标签: c# asynchronous async-await

我对异步编程和等待的方式有疑问。我知道当方法是异步时你可以使用等待等待特定代码的执行,但我想了解更多。

所以我有一个具体的问题:

想象一下,我有一个方法:

public async void Starter()
{
    string username = await GetUserNameFromDBAsync();
    bool updated = await UpdateUserTown();
}

public async static Task<string> GetUserNameFromDBAsync()
{
    using(DBContext context = new DBContext())
    {
       return await context.User.FindByIdAsync(currentid).Name;
    }
}

public async static Task<bool> UpdateUserTown()
{
    using(DBContext context = new DBContext())
    {
       User user = await context.User.FindUserByIDAsync(currentid);
       user.Town="New Town";
       try
       {
          context.SaveChangesAsync();
       }
       catch(Exception ex)
       {return false}
       return true;
    }
}

好的做这个代码,虽然我在任何地方使用异步,但是我必须等待...所以基本上对于性能它将完全相同,如果我将删除所有这些asyncs并等待并且没有...

或许我想念一些东西?

1 个答案:

答案 0 :(得分:6)

在桌面应用程序中,async与性能无关,而与响应性有关。在执行长时间运行的I / O绑定操作时,您不希望应用程序的GUI冻结。实现这一目标的通常方法是通过线程,但是线程昂贵且难以正确同步,如果您想要做的就是在从Web服务中提取数据时保持UI响应,那就太过分了。

在Web应用程序中,拥有async控制器可让您的网站同时处理更多请求,因为运行控制器的线程可以返回线程池并在等待{{1完成。

另外,关于代码的说明:除非是事件处理程序,否则永远不会标记为await。您不能async void await方法,也无法捕获发生的异常。相反,如果您的方法没有返回任何内容,请使用async void