C# 异步等待代码未按预期执行

C# 异步等待代码未按预期执行,c#,async-await,task-parallel-library,C#,Async Await,Task Parallel Library,我创建了一个简单的示例来理解C#中的异步/等待 未被阻止,将很快进行评估。 我认为印刷订单应该是 This happens before await Main in the middle processing... This happens after await. This result of await is 2147483647 然而事实并非如此,为什么呢?我将附议(第三?)其他人的建议,让您继续阅读和学习异步。我偏爱我自己的,但是现在有很多好的 我的问题是,因为wait不会阻止

我创建了一个简单的示例来理解C#中的异步/等待

未被阻止,将很快进行评估。 我认为印刷订单应该是

 This happens before await
 Main
 in the middle processing...
 This happens after await. This result of await is 2147483647
然而事实并非如此,为什么呢?

我将附议(第三?)其他人的建议,让您继续阅读和学习
异步
。我偏爱我自己的,但是现在有很多好的

我的问题是,因为wait不会阻止计算异步方法的线程。我的理解是,如果异步需要很长时间,它将返回其调用方法

这是错误的部分。异步与一件事情需要多长时间无关

有两条知识不见了,都在我的书中

首先:
await
首先检查其参数。如果已经完成,则
wait
继续同步执行

第二:同步调用每个方法。包括
async
方法。异步发生的唯一时间是
async
方法的
await
参数尚未完成时;在这种情况下,该
async
方法返回一个未完成的任务


把这两者放在一起应该可以解释为什么你的代码实际上是同步运行的。

QuxAsync中没有任何东西实际上是异步的,仅仅因为它被标记为异步的,并不意味着它是异步的。您的操作是同步运行的,这就是为什么打印顺序是这样的。我无法解释您询问的确切原因,但我可以解释
WebApi的
的一个场景,我仍然对在控制台应用程序中运行
wait/async
代码有模糊的理解,因为我不必经常这样做。当我这样做时,我会使用
Task.Result()
来获得结果。无论如何,
wait任务
将允许当前线程执行释放回线程池,并让另一个线程使用它。一旦工作完成,任务调度器然后分配相同的线程或可用线程(如果使用了
。configurewait(false)
),并继续工作。它确实阻止了线程
async
并不意味着并行,
Task
也不意味着线程。通过创建示例来学习是很好的,但是如果你必须对所有没有按照你想象的方式发生的事情提出问题,那么你将走上一条漫长而痛苦的道路,我建议你先研究
async,然后等待更多。检查stackoverflow并查看所有async和Wait标记/问题和答案。看看斯蒂芬·克利里斯和斯蒂芬·图布斯blogs@MickyD:并发和异步不是一回事;异步工作流不需要是并发的。例如,考虑工作流“嘟嘟喇叭,然后异步等待一秒钟,然后打开门”,消息在异步等待中到达,可以在10毫秒内处理。您不需要第二个工作线程来实现此异步流。@您好:实验是一个好主意,特别是因为它表明您对异步有一些错误的想法。这是一个获得正确信念的好机会。我赞成上面的建议,你先多读书。我还建议你在GUI应用程序中进行实验。控制台应用程序对于异步工作流有一个不寻常的线程上下文,这可能会令人困惑。GUI应用程序使您更容易了解如何通过单个线程实现异步工作流。谢谢您的时间。我会看你的信息。但在此之前,在我的例子中,我如何知道参数是否已完成?@Hello:
Task.FromResult
返回已完成的任务。在引擎盖下,生成了一个状态机。在结构的
MoveNext
方法中,
TaskAwaiter.IsCompleted
用于返回或不返回。我想等待的第一个理由是它。我不知道Task Completed如何连接到此参数(
TaskWaiter.IsCompleted
)?@Hello:是的,为
BarAsync
生成了一个状态机。当执行该状态机的第一个状态时,
BarAsync
中的代码运行,包括调用
QuxAsync
并获取其返回值(
Task.FromResult
)。然后,状态机(作为
await
的一部分)检查任务是否已完成,因此它继续执行,并从
BarAsync
返回已完成的任务。
Console.WriteLine("Main");
 This happens before await
 Main
 in the middle processing...
 This happens after await. This result of await is 2147483647