等待查询.来自 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实际执行此命令时,我的网站只是不断加载和加载。我永远不会越过这条线到下一条线。它就卡在那里。

有人对此有解决方案吗?

等待查询.来自 Parse 的 FindAsync() 不起作用

您遇到了一个经典的死锁场景,我在博客和 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);
}