【问题标题】:Get object synchronously from Parse in Xamarin从 Xamarin 中的 Parse 同步获取对象
【发布时间】: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


【解决方案1】:

您遇到了经典的异步死锁。您正在调用的异步代码本身在某处(或等效的)调用await,它正在调度将在捕获的同步上下文中运行的延续。您正在用您的忙等待(甚至是非忙等待,当您尝试过)阻止该上下文。异步操作在您让它运行之前无法完成,并且在它完成之前您不会让它运行。死锁。

到目前为止,最好的选择是让这个方法实际上是异步的。如果你使用任何异步,你应该“一直异步”并使一切异步。如果您不愿意这样做,那么就一直使用同步方法,而不是异步方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 1970-01-01
    相关资源
    最近更新 更多