c# - 异步方法和等待

标签 c# asynchronous async-await

我对异步编程和等待的方式有疑问。我知道当方法是异步时,您可以使用 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;
    }
}

好的,执行这段代码,虽然我在任何地方都使用异步,但我一直都必须等待...所以基本上为了性能,它与我删除所有这些异步和等待并在没有的情况下执行它完全相同...

或者我错过了什么?

最佳答案

在桌面应用程序中,async 与性能无关,而是与响应能力有关。您不希望应用程序的 GUI 在执行长时间运行的 I/O 绑定(bind)操作时卡住。实现这一点的通常方法是通过线程,但线程成本高昂且难以正确同步,如果您只想在从 Web 服务中提取数据时保持 UI 响应,那么它们就太过分了。

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

此外,请注意您的代码:您永远不要将某些东西标记为async void,除非它是事件处理程序。您不能 await async void 方法,也不能捕获发生的异常。相反,如果您的方法不返回任何内容,请使用 async Task

关于c# - 异步方法和等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21353006/

相关文章:

c# - 无法对 json 响应对象执行 for 循环

javascript - 回调作为对象 - 它与 JavaScript 中的异步编程有何关系

c# - 转换方法以返回任务

c# - 如何在控制台应用程序中从 Task.WaitAll() 获取返回值?

c# - 获取本地网络服务器上所有 UNC 共享文件夹的列表

c# - 如何以可靠的方式管理外部资源?

c# - 通过提供代理 token 处理来自 webapi 的长承载 token

c# - 下载图像时异步/等待死锁

c# - 如何限制多个异步任务?

c# - 运行多个异步任务并等待它们全部完成