C# 正在等待异步操作

C# 正在等待异步操作,c#,C#,我正在看另一个开发人员的这些代码行: bool isValid = await engine.GetTaskByIdAsync(taskId); if(isValid ) .... 当我使用async操作时,是在异步操作完成时执行独立的工作: Task<bool> task = engine.GetTaskByIdAsync(taskId); //Do work that doesn't need the "task" variable bool com

我正在看另一个开发人员的这些代码行:

  bool isValid = await engine.GetTaskByIdAsync(taskId);
  if(isValid )
  ....
当我使用
async
操作时,是在异步操作完成时执行独立的工作:

  Task<bool> task = engine.GetTaskByIdAsync(taskId);

  //Do work that doesn't need the "task" variable

  bool completed = await task;
  if(bool)
  ....
Task Task=engine.GetTaskByIdAsync(taskId);
//做不需要“任务”变量的工作
bool completed=等待任务;
如果(bool)
....

第一个示例似乎启动了一个异步操作,然后立即开始等待。我不明白这里有什么价值吗

注意:此代码位于应用程序的数据访问层中,因此它不与用户界面交互

我不明白这里有什么价值吗

绝对-这意味着,尽管您需要操作返回的值才能执行更多的工作,但在等待线程时,您不会占用线程。如果您正在编写GUI,这一点尤其重要,因为绑定GUI线程基本上意味着冻结UI


这听起来像是在关注异步的“并行处理多件事情”这一方面,这很重要,但远不是它的唯一好处。

通常犯的错误是等待块。没有


当前线程立即返回,函数的其余部分注册为在异步任务完成时执行。

当然,启动一个进程并立即返回,如果事先有逻辑又有什么关系?“第一个示例似乎启动了一个异步操作,然后立即开始等待”-
await
使我们在继续之前等待调用完成。如果不等待任务,您将如何做程序员所做的事情?@DanPantry No。它不会。不幸的是,这是一个常见的误解。它使方法的其余部分连接起来作为等待的任务的延续,并在该任务完成时执行。这与等待任务非常不同。使用立即等待是为了不锁定用户界面。好的一点,我专门处理web,所以这不是我通常处理的事情。这段代码是我在数据访问层中发现的,所以我很好奇是否有什么东西可以从中收集到。@ChrisHardie web应用程序仍然可以从异步中获益。它可以允许web请求在不执行CPU绑定的工作时不占用线程池线程的时间,允许这些线程池线程服务于其他请求,允许服务器扩大它可以服务的可能并发请求的数量。@Servy首先增加Web服务器可用的线程数量不是更好吗?添加wait确实会带来开销,但不会神奇地增加系统可用的cpu周期数。虽然您在技术上是正确的,但我认为您最好正确调整Web服务器。@AVee No,
await
不需要实际线程来完成任何工作。异步的全部要点是,除非有CPU限制的工作要在线程上执行,否则实际上不会使用线程。在正确编写的异步程序中执行非CPU限制的工作时,实际上没有线程。@AVee:假设有1000个请求同时执行,所有这些请求都需要在一秒钟内执行基于IO的操作(例如web服务调用)。使用async/await,您可以只使用一个线程(或者更确切地说,只使用实际能够同时工作的线程数)。同步进行调用需要1000个线程,所有线程都被阻塞,除了占用它们之间1GB的堆栈空间之外什么也不做。基本上,你假设阻塞的线程是免费的,而我说的不是。