C#5异步/等待线程机制感觉不对?

时间:2012-01-13 16:57:04

标签: c# .net asynchronous c#-5.0

为什么调用线程会进入异步方法,直到内部'await'?

调用异步方法后立即生成线程不是更清晰。这样你就可以确定async方法立即返回。您不必担心在异步方法的早期阶段没有做任何昂贵的事情。

我倾向于想知道一个方法是否会在'my'线程上执行代码。是否阻止。这种模式似乎打开了一系列中间可能性。

设计师比我聪明得多,所以我确信有充分的理由,我只是想了解它。

3 个答案:

答案 0 :(得分:38)

  

一旦调用异步方法,就不会产生线程。

" async"的重点方法是避免产生一个新线程。

你混淆了并发性的异步性。异步方法不需要在另一个线程上运行就是异步的。异步方法的重点在于它们允许您将工作分解为需要在特定顺序中运行的小部分,但不一定是而无需在同一线程上执行其他工作

将线程视为您可以雇佣的员工。将异步方法视为待办事项列表,并在项目之间暂停。如果你的待办事项清单上写着"去商店,买牛奶和鸡蛋,回家,做煎蛋和#34;那么异步的好处就是当有人在你的手机之间打电话时。买鸡蛋"步骤和回家"一步,然后说“你可以在回家的路上经过药房来接我的处方吗?"您可以接听电话并安排之前的工作进行煎蛋。使用非异步方法,您的手机会一直响铃,直到煎蛋卷完成,然后您接听电话。用户界面阻止,直到您完成了自己正在做的事情。

您的概念是,为了保持UI线程的响应性,当您获得待办事项列表时,您会雇佣一些人为您跑到商店,以便您可以自由接听电话关于药房。 这是昂贵且不必要的。所有东西都可以在同一个线程上保持异步,因为长时间运行的任务有内置点,UI会中断并安排更多工作

答案 1 :(得分:3)

我喜欢将async..await视为延续传递式编程的语法糖。

考虑到这一点,它与线程无关。

答案 2 :(得分:2)

  

我倾向于想知道方法是否会在'my'线程上执行代码。

我认为这是一种特殊的欲望,对任何特征都不是一个好的论据。

async / await的要点是启动异步操作和处理结果的代码可以保存在一个方法中。

如果没有它,你将被迫将逻辑上属于的代码分成两部分。