等待查询.来自 Parse 的 FindAsync() 不起作用
本文关键字:不起作用 FindAsync 查询 来自 Parse 等待 | 更新日期: 2023-09-27 18:33:55
我有一个来自 Parse.com 的在线数据库。有一个表"Vakantie",其中包含 3 个对象,因此表数据不大。
我正在尝试从该表中获取所有对象,以便我可以通过我的 VakantieController 在视图中显示它们。
Parse 有自己的文档,其中提供了示例代码。我复制了他们的示例代码并对其进行了编辑,使其适合我的网站。
故事:
VakantieController:
public ActionResult Index()
{
var vakantiesTask = vakantieRepository.FindAll();
IEnumerable<Vakantie> vakanties = vakantiesTask.Result;
return View(vakanties);
}
VakantieRepository(包含要从写入数据库检索的代码的类(:
public async Task<IList<Vakantie>> FindAll()
{
var query = from v in ParseObject.GetQuery("Vakantie")
orderby v.Get<string>("titel") ascending
select v;
IEnumerable<ParseObject> objects = await query.FindAsync();
IList<Vakantie> vakanties = new Vakantie[] { };
foreach (ParseObject vakantieObject in objects)
{
Vakantie vakantie = GetVakantie(vakantieObject);
vakanties.Add(vakantie);
}
return vakanties;
}
方法'GetVakantie(vakantieObject((是我编写的一种方法,它将我从查询结果中获得的ParseObject转换为我的域中的Vakantie对象。
当我运行这段代码时,我得到直到以下行:
IEnumerable<ParseObject> objects = await query.FindAsync();
当Visual Studio实际执行此命令时,我的网站只是不断加载和加载。我永远不会越过这条线到下一条线。它就卡在那里。
有人对此有解决方案吗?
您遇到了一个经典的死锁场景,我在博客和 MSDN 文章中对此进行了完整描述。总之,await
将捕获当前的"上下文"并使用它来恢复async
方法。此外,ASP.NET 上下文一次只允许一个线程。因此,当请求线程被阻塞(在Task<T>.Result
上(时,FindAll
内部的await
无法在该上下文中恢复async
方法,最终会出现死锁。
要纠正它,请"一路"使用异步;即,不要使用Task<T>.Result
:
public async Task<ActionResult> Index()
{
var vakantiesTask = vakantieRepository.FindAll();
IEnumerable vakanties = await vakantiesTask;
return View(vakanties);
}