C#异步和等待不起作用

时间:2016-02-08 22:45:32

标签: c# asynchronous

为什么以下Template.XmlDocId = Template.XmlDoc.Idasync无效?我试图了解这是想了解我的代码有什么问题。

await

程序启动count()方法,但在没有完成的情况下退出。随着等待任务;语句我希望它在退出之前等待完成count()方法的所有循环(0,1,2,3,4)。我只得到“计数循环:0”。但是它经历了所有的callCount()。它就像等待任务一样没有做任何事情。我希望count()和callCount()都异步运行并在完成时返回main。

1 个答案:

答案 0 :(得分:13)

执行async方法时,它会同步开始运行,直到达到await语句,然后其余代码异步执行,执行返回给调用者。

在您的代码callCount()开始同步到await task,然后回到Main()方法,由于您没有等待方法完成,程序结束时没有方法{{ 1}}可以完成。

您可以通过将返回类型更改为count()并在Task方法中调用Wait()来查看所需的行为。

Main()

修改 这就是代码的执行方式:

(为了更好地理解,允许更改static void Main(string[] args) { callCount().Wait(); } static void count() { for (int i = 0; i < 5; i++) { System.Threading.Thread.Sleep(2000); Console.WriteLine("count loop: " + i); } } static async Task callCount() { Task task = new Task(count); task.Start(); for (int i = 0; i < 3; i++) { System.Threading.Thread.Sleep(1000); Console.WriteLine("Writing from callCount loop: " + i); } Console.WriteLine("just before await"); await task; Console.WriteLine("callCount completed"); } 将类型返回到CallCount()

  1. 程序以Task方法开始。
  2. Main()方法被调用。
  3. 创建任务,所有这些都在同一个线程中。
  4. 然后任务开始。此时,将创建一个并行运行CallCount()方法的新线程。
  5. 在CallCount()中继续执行,执行循环并打印“就在等待之前”。
  6. 然后到达Count()。这是async-await模式发挥作用的时候。 await task;await不同,它在任务完成之前不会阻止当前线程,但会将执行控制返回到Wait()方法以及Main()中的所有剩余指令(在这种情况下,只有CallCount())将在任务完成后执行。
  7. Console.WriteLine("callCount completed");中,对Main()的调用会返回CallCount()(剩余的Task指令和原始任务)并继续执行。
  8. 如果您不等待此任务完成,CallCount()中的执行将继续完成程序和正在销毁的任务。
  9. 如果你致电Main()(如果Wait()无效,你没有等待的任务)你让任务完成,保持CallCount()执行Main()并且“callCount completed”正在打印。
  10. 如果您想在Count()中等待计数任务完成而不返回CallCount()方法,请致电Main(),所有程序都将等待task.Wait();,但这是不是Count()会做什么。

    这个link详细解释了async-await模式。

    希望您的代码工作流程图能够帮助您。

    enter image description here