【发布时间】:2014-01-15 14:43:37
【问题描述】:
我正在尝试通过以下代码从类中同步获取和对象:
var userName = ParseObject.GetQuery ("Users")
.WhereEqualTo("UserName","usernameOfUser") ;
var responseUserName = userName.FindAsync();
do {
} while(!responseUserName.IsCompleted || !responseUserName.IsFaulted);
if(responseUserName.IsFaulted){
Console.WriteLine("Faulted");
}
IEnumerable<ParseObject> result = responseUserName.Result;
但“responseUserName”状态始终为“waitingForActivation”。
如果我做错了,请告诉同步从类中获取对象的正确方法。
更新:我不能使用等待。因为对于等待,我必须将方法声明为异步。但在得到查询结果之前,我不想将控制权返回给前端开发人员(UI 开发人员)。
更新 2:我可以使用 ContinueWith 方法获得结果。但在我得到结果之前它不会阻止执行。
var userName = ParseObject.GetQuery (Constants.TABLE_USER)
.WhereEqualTo(Constants.COL_USER_NAME,user.GetUserName());
Users RegisteredUser = new Users ();
var responseUserName = userName.FindAsync().ContinueWith(t=>{
IEnumerable<ParseObject> result = t.Result;
if (result.Count() >= 0) {
Console.WriteLine("Got Records" + result.Count());
}
});
谢谢
【问题讨论】:
-
如果 FindAsync 返回一个任务,您应该调用
await userName.FindAsync()或userName.FindAsync().Result来获取实际的返回值。紧密的循环是没有意义的,.Result 将阻塞,直到结果可用 -
通过这个 'userName.FindAsync().Result' 我仍然没有得到结果。我正在使用 while 循环来检查状态。
-
你得到了什么?检查状态没有意义,.Result 将始终阻塞并返回操作结果。您已经使用
responseUserName.Result执行此操作。如果结果为空,则没有数据返回 -
数据不为空,类中有3条相关记录。我什么也得不到。应用程序卡在这一点上。并且没有进一步处理。
-
顺便说一句,您检查了 documentation 的 FindAsync 吗?该代码使用
await,而不是紧密循环。无论如何result不包含任何内容或 3 条记录?该应用程序在哪里卡住了?.Result阻塞直到异步调用完成,但这就是你所要求的。此外,检查任务是否有故障是没有意义的:.Result将在出现错误时抛出异常。不过,您确实需要了解 Tasks 和async\await的工作原理。
标签: c# task-parallel-library xamarin async-await parse-platform