c# - 等待 Parse 中的 query.FindAsync() 不起作用

标签 c# asp.net-mvc parse-platform task-parallel-library async-await

我有一个来自 Parse.com 的在线数据库。有一个表“Vakantie”,包含3个对象,所以表数据不大。

我正在尝试从该表中获取所有对象,以便我可以通过我的 VakantieController 在 View 中显示它们。

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 转换为来 self 的域的 Vakantie 对象。

当我运行此代码时,我会看到以下行:

IEnumerable<ParseObject> objects = await query.FindAsync();

当 Visual Studio 实际执行此命令时,我的网站只是不断加载。我从来没有越过这一行进入下一行。它就卡在那里。

有人有解决办法吗?

最佳答案

你遇到了一个典型的死锁场景,我 describe in full on my blogan MSDN article 。总之,await将捕获当前的“上下文”并使用它来恢复 async方法。此外,ASP.NET 上下文一次只允许一个线程。因此,当请求线程被阻塞时(在 Task<T>.Result 上), await FindAll里面无法恢复 async方法在该上下文中,并且最终会陷入死锁。

要纠正它,请“一直”使用异步;即,不要使用 Task<T>.Result :

public async Task<ActionResult> Index()
{
  var vakantiesTask = vakantieRepository.FindAll();
  IEnumerable vakanties = await vakantiesTask;
  return View(vakanties);
}

关于c# - 等待 Parse 中的 query.FindAsync() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27408452/

相关文章:

c# - 从 Winform 显示 pdf 文件

asp.net - 错误请求 - 无效主机名 ASP.NET MVC4

javascript - 启用 使用 Jquery 禁用某些组件

ios - 从指针接收图像

c# - ASP.NET Core 中的循环依赖

c# - 为任意一组键(任意数据类型)获取可散列对象的最有效方法

c# - 我可以使用什么 JavaScript 代码在新窗口中打开,而不是我之前打开的窗口

c# - 脚手架和显示/编辑器模板

ios - 使用 Parse-Server 时,Parse LocalDataStore 不起作用 - 'Method requires Pinning enabled.'

parse-platform - 解析 - 安装表未设置 deviceToken 或 pushType