我有一个async task
方法,我正在调用页面加载,它成功进入方法,但它"冻结"在一行,我将在下面指出,我无法弄清楚为什么.
protected void Page_Load(object sender, EventArgs e) { ParseClient.Initialize("AppKey", ".NetKey"); Load().Wait(); } public async Task Load() { ParseQuerymyQuery = ParseObject.GetQuery("myClass"); IEnumerable results = await myQuery.FindAsync(); foreach (ParseObject result in results) { string firstName = result.Get ("name"); } }
在这条线上对我来说是"冻结":
IEnumerableresults = await myQuery.FindAsync();
这可能是我正在寻找的一个非常基本的东西,我似乎无法找到它...任何建议?
你有两个任务."内在"任务是"找到一些结果"."外部"任务是"获取查询,查找一些结果,枚举结果".
请注意,外部任务取决于内部任务的完成.
执行Load.这会创建"外部"任务.然后它创建"内部"任务并返回.为什么?因为你说await
- 异步等待 - 内部任务完成.因此,您必须立即将控制权返回给调用者,以便它可以继续工作.外部任务返回给调用者.
来电者做什么?它说"在外部任务完成之前停止一切".现在,告诉我,这应该是怎么回事?将执行外部任务的剩余部分的线程目前处于冻结状态,等待外部任务完成.你说"线程,异步做一些工作,直到完成后才能工作 ".那么,你的愿望将被授予; 没有工作将完成,线程将等待工作完成,这将永远不会.
现在,即使通过一些奇迹内部任务完成 - 也许它正在另一个线程上运行 - 它仍然必须发出外部任务"内部任务完成,所以你现在可以完成你的工作"在你刚才的线程上僵住了.
如何在页面加载方法中触发异步方法?
看这个页面:
http://www.asp.net/web-forms/overview/performance-and-caching/using-asynchronous-methods-in-aspnet-45