我有一个来自 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 blog和 an 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/