我有一个async task
方法,我在页面加载时调用它,它已成功进入方法,但它在一条线上“冻结”,我将在下面指出,我无法弄清楚原因。
protected void Page_Load(object sender, EventArgs e)
{
ParseClient.Initialize("AppKey", ".NetKey");
Load().Wait();
}
public async Task Load()
{
ParseQuery<ParseObject> myQuery = ParseObject.GetQuery("myClass");
IEnumerable<ParseObject> results = await myQuery.FindAsync();
foreach (ParseObject result in results)
{
string firstName = result.Get<string>("name");
}
}
这条线对我来说是“冻结”:
IEnumerable<ParseObject> results = await myQuery.FindAsync();
这可能是一个非常基本的事情,我正在寻找,我似乎无法找到它...任何建议?
答案 0 :(得分:5)
你有两个任务。 &#34;内部&#34;任务是&#34;找到一些结果&#34;。 &#34;外部&#34;任务是&#34;得到查询,找到一些结果,列举结果&#34;。
请注意,外部任务取决于内部任务的完成。
执行Load。这创造了&#34;外部&#34;任务。然后它创建&#34;内部&#34;任务和回报。为什么?因为你说await
- 异步等待 - 内部任务完成。因此,您必须立即将控制权返回给调用者,以便它可以继续工作。外部任务将返回给调用者。
来电者做什么?它说&#34;停止一切,直到外部任务完成&#34;。现在,告诉我,这应该是怎么回事?将执行外部任务的剩余部分的线程目前处于冻结状态,等待外部任务完成。你说&#34;线程,做一些异步的工作并且在完成之前不做任何工作&#34;。那么,你的愿望将被授予;没有工作将完成,线程将等待工作完成,这将永远不会。
现在,即使通过一些奇迹,内部任务完成 - 也许它正在另一个线程上运行 - 它仍然必须发出外部任务信号&#34;内部任务已完成,因此您现在可以完成工作&# 34;在你刚刚冻结的线程上。
如何在页面加载方法中触发异步方法?
参见本页: