为什么以下Template.XmlDocId = Template.XmlDoc.Id
和async
无效?我试图了解这是想了解我的代码有什么问题。
await
程序启动count()方法,但在没有完成的情况下退出。随着等待任务;语句我希望它在退出之前等待完成count()方法的所有循环(0,1,2,3,4)。我只得到“计数循环:0”。但是它经历了所有的callCount()。它就像等待任务一样没有做任何事情。我希望count()和callCount()都异步运行并在完成时返回main。
答案 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()
)
Task
方法开始。Main()
方法被调用。CallCount()
方法的新线程。Count()
。这是async-await模式发挥作用的时候。 await task;
与await
不同,它在任务完成之前不会阻止当前线程,但会将执行控制返回到Wait()
方法以及Main()
中的所有剩余指令(在这种情况下,只有CallCount()
)将在任务完成后执行。Console.WriteLine("callCount completed");
中,对Main()
的调用会返回CallCount()
(剩余的Task
指令和原始任务)并继续执行。CallCount()
中的执行将继续完成程序和正在销毁的任务。Main()
(如果Wait()
无效,你没有等待的任务)你让任务完成,保持CallCount()
执行Main()
并且“callCount completed”正在打印。如果您想在Count()
中等待计数任务完成而不返回CallCount()
方法,请致电Main()
,所有程序都将等待task.Wait();
,但这是不是Count()
会做什么。
这个link详细解释了async-await模式。
希望您的代码工作流程图能够帮助您。