问题描述
privatevoidNN(){Test();Console.WriteLine("NN");}asyncvoidTest(){awaitLoadData();Console.WriteLine("Test");}asyncTask<string>LoadData(){returnawaitTask.Run(()=>{Task.Delay(6000).Wait();Console.WriteLine("LoadDataIn");return"";});}
执行结果:NNLoadDataInTest
跟我想象的不一样为什么调用Test()方法后,不等待Test()方法执行完成,就继续向下执行了?
解决方案
解决方案二:
该回复于2015-11-24 16:14:05被版主删除
解决方案三:
是await内部会等待,改成下面的就等待了privateasyncstaticvoidNN(){awaitTest();Console.WriteLine("NN");}staticasyncTaskTest(){vard=awaitLoadData();Console.WriteLine(d);Console.WriteLine("Test");}staticasyncTask<string>LoadData(){returnawaitTask.Run(()=>{Task.Delay(6000).Wait();Console.WriteLine("LoadDataIn");return"LoadData";});}
解决方案四:
或者你把privateasyncstaticvoidNN(){awaitTest();Console.WriteLine("NN");}
改成privatestaticvoidNN(){Test();Console.WriteLine("NN");}
这时候VS会给你提示的
解决方案五:
引用2楼starfd的回复:
是await内部会等待,改成下面的就等待了privateasyncstaticvoidNN(){awaitTest();Console.WriteLine("NN");}staticasyncTaskTest(){vard=awaitLoadData();Console.WriteLine(d);Console.WriteLine("Test");}staticasyncTask<string>LoadData(){returnawaitTask.Run(()=>{Task.Delay(6000).Wait();Console.WriteLine("LoadDataIn");return"LoadData";});}
是不是同步调用Test(),如果里面没有await关键字,这个方法就同步执行;如果vard=awaitLoadData();之前还有部分同步代码,前面的依旧是同步执行,在vard=awaitLoadData();这里马上就变成异步执行了,此时调用Test();后面的代码(Console.WriteLine("NN");)也立马可以执行了感觉好像是await的Task及之后的代码整体上全部是异步执行了(awaitTest();Console.WriteLine("NN");),而不是我想的整个方法里面一次顺序执行.请问,大概是这样吗?
解决方案六:
await内部是一次执行,但因为你的声明asyncvoidTest(),所以在调用Test方法时,这里不会等待,内部有await关键字,那段会进行等待