C# 异步方法和等待

C# 异步方法和等待,c#,asynchronous,async-await,C#,Asynchronous,Async Await,我对异步编程的方式有疑问,请等待。我知道当方法是异步的时,可以使用wait来等待特定代码的执行,但我想了解更多 所以我有一个特别的问题: 假设我有一个方法: public async void Starter() { string username = await GetUserNameFromDBAsync(); bool updated = await UpdateUserTown(); } public async static Task<string> Ge

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

所以我有一个特别的问题:

假设我有一个方法:

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;
    }
}
public异步void Starter()
{
字符串username=await GetUserNameFromDBAsync();
bool updated=等待UpdateUserTown();
}
公共异步静态任务GetUserNameFromDBAsync()
{
使用(DBContext context=new DBContext())
{
返回wait context.User.FindByIdAsync(currentid).Name;
}
}
公共异步静态任务UpdateUserTown()
{
使用(DBContext context=new DBContext())
{
User User=wait context.User.finduserbyadasync(currentid);
user.Town=“newtown”;
尝试
{
context.saveChangesSync();
}
捕获(例外情况除外)
{返回false}
返回true;
}
}
好的,做这段代码,虽然我使用everywhere异步,但我一直在等待。。。因此,基本上,对于性能来说,它将完全一样,如果我将删除所有这些异步,并等待和做它没有


或者我错过了什么?

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

在web应用程序中,使用
async
控制器可以让您的网站同时处理更多请求,因为运行控制器的线程可以返回到线程池,并在等待
等待
完成时服务更多请求


另外,在代码上要注意:除非是事件处理程序,否则永远不要将某个对象标记为
async void
。您不能等待
异步void
方法,也不能捕获发生的异常。相反,如果您的方法没有返回任何内容,请在桌面应用程序中使用
async Task

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

在web应用程序中,使用
async
控制器可以让您的网站同时处理更多请求,因为运行控制器的线程可以返回到线程池,并在等待
等待
完成时服务更多请求


另外,在代码上要注意:除非是事件处理程序,否则永远不要将某个对象标记为
async void
。您不能等待
异步void
方法,也不能捕获发生的异常。相反,如果您的方法没有返回任何内容,请使用
async Task

哦,我明白了,所以即使是在web应用程序中,因为我认为如果必须等待数据库的响应等,那么使用async有什么意义(如果您仍然需要等待)))哈,但现在我明白了,这意味着它可以同时处理来自其他Web浏览器的其他请求。。。因为是的,在这个例子中,我更多的是谈论web应用程序)顺便说一句,我想问一下,你们有什么资源可以让我阅读web应用程序和异步?哦,我明白了,所以即使在web应用程序中,因为我认为如果我必须等待来自数据库的响应等,那么使用async有什么意义(如果你仍然需要等待)))哈,但现在我明白了,这意味着它可以同时处理来自其他WebBrowser的其他请求。。。因为是的,在这种情况下,我更多的是谈论web应用程序)顺便说一句,我想问一下,你们有什么资源可以让我阅读有关web应用程序和异步的内容吗?