当前位置:  开发笔记 > 编程语言 > 正文

异步任务未触发

如何解决《异步任务未触发》经验,为你挑选了1个好方法。

我有一个async task方法,我正在调用页面加载,它成功进入方法,但它"冻结"在一行,我将在下面指出,我无法弄清楚为什么.

 protected void Page_Load(object sender, EventArgs e)
 {
     ParseClient.Initialize("AppKey", ".NetKey");

     Load().Wait();
 }    

 public async Task Load()
 {
     ParseQuery myQuery = ParseObject.GetQuery("myClass");
     IEnumerable results = await myQuery.FindAsync();
     foreach (ParseObject result in results)
     {
         string firstName = result.Get("name");
     }
 }

在这条线上对我来说是"冻结":

IEnumerable results = await myQuery.FindAsync();

这可能是我正在寻找的一个非常基本的东西,我似乎无法找到它...任何建议?



1> Eric Lippert..:

你有两个任务."内在"任务是"找到一些结果"."外部"任务是"获取查询,查找一些结果,枚举结果".

请注意,外部任务取决于内部任务的完成.

执行Load.这会创建"外部"任务.然后它创建"内部"任务并返回.为什么?因为你说await- 异步等待 - 内部任务完成.因此,您必须立即将控制权返回给调用者,以便它可以继续工作.外部任务返回给调用者.

来电者做什么?它说"在外部任务完成之前停止一切".现在,告诉我,这应该是怎么回事?将执行外部任务的剩余部分的线程目前处于冻结状态,等待外部任务完成.你说"线程,异步做一些工作,直到完成后才能工作 ".那么,你的愿望将被授予; 没有工作将完成,线程将等待工作完成,这将永远不会.

现在,即使通过一些奇迹内部任务完成 - 也许它正在另一个线程上运行 - 它仍然必须发出外部任务"内部任务完成,所以你现在可以完成你的工作"在你刚才的线程上僵住了.

如何在页面加载方法中触发异步方法?

看这个页面:

http://www.asp.net/web-forms/overview/performance-and-caching/using-asynchronous-methods-in-aspnet-45


@EricLippert,你的最后一段:因为它是我们讨论的ASP.NET,所以不能保证在同一个线程上安排post``itit`延续(即使没有`ConfigureAwait(false)`你受到了'AspNetSynchronizationContext`的支配,所以死锁可能会也可能不会发生,具体取决于它决定运行延续的线程.
推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有