C# 从Xamarin中的解析同步获取对象

C# 从Xamarin中的解析同步获取对象,c#,task-parallel-library,xamarin,async-await,parse-platform,C#,Task Parallel Library,Xamarin,Async Await,Parse Platform,我正试图通过以下代码从类中同步获取和对象: var userName = ParseObject.GetQuery ("Users") .WhereEqualTo("UserName","usernameOfUser") ; var responseUserName = userName.FindAsync(); do { } while(!responseUserName.IsCompleted || !responseUserName.IsFaulted); if

我正试图通过以下代码从类中同步获取和对象:

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”状态始终等待激活

如果我做错了,请告诉我从类同步获取对象的正确方法

更新:我不能使用等待。因为对于wait,我必须将方法声明为async。但在得到查询结果之前,我不想将控制权返回给前端开发人员

更新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());
        }
});

谢谢

您遇到了经典的异步死锁。您正在调用的异步代码本身正在调用wait-where或等效代码,它正在调度将在捕获的同步上下文中运行的continuations。当您尝试过这种方法时,您正在使用忙碌等待甚至非忙碌等待来阻止该上下文。异步操作只有在您让它运行时才能完成,并且在它完成之前您不会让它运行。僵局


到目前为止,最好的选择是使此方法实际上是异步的。如果您使用任何异步,那么您应该一直异步,并使所有内容都异步。如果您不愿意这样做,那么就一直使用同步而不是异步方法。

您遇到了经典的异步死锁。您正在调用的异步代码本身正在调用wait-where或等效代码,它正在调度将在捕获的同步上下文中运行的continuations。当您尝试过这种方法时,您正在使用忙碌等待甚至非忙碌等待来阻止该上下文。异步操作只有在您让它运行时才能完成,并且在它完成之前您不会让它运行。僵局


到目前为止,最好的选择是使此方法实际上是异步的。如果您使用任何异步,那么您应该一直异步,并使所有内容都异步。如果您不愿意这样做,那么只需一直使用同步而不是异步方法。

如果FindAsync返回任务,您应该调用Wait userName.FindAsync或userName.FindAsync.Result来获取实际返回值。紧循环是没有意义的,.Result将阻塞,直到结果可用为止。通过执行“userName.FindAsync.Result”我仍然没有得到结果。我使用while循环只是为了检查状态。你得到了什么?检查状态没有意义,.Result将始终阻止并返回操作结果。您已经使用responseUserName.Result执行了此操作。如果结果为空,则没有要返回的数据。如果数据不为空,则类中有3条相关记录。我什么也得不到。应用程序在这一点上被卡住了。没有进一步的处理。顺便问一下,您是否检查了FindAsync?代码使用wait,而不是紧密循环。无论如何,结果是否不包含任何内容或3条记录?应用程序在哪里卡住了。结果会一直阻塞,直到异步调用完成,但这正是您所要求的。此外,检查任务是否出错也没有意义:。如果出现错误,Result将引发异常。但是,您确实需要了解任务和async\await是如何工作的。如果FindAsync返回任务,则应调用await userName.FindAsync或userName.FindAsync.Result以获取实际返回值。紧循环是没有意义的,.Result将阻塞,直到结果可用为止。通过执行“userName.FindAsync.Result”我仍然没有得到结果。我使用while循环只是为了检查状态。你得到了什么?检查状态没有意义,.Result将始终阻止并返回操作结果。您已经使用responseUserName.Result执行了此操作。如果结果为空,则没有要返回的数据。如果数据不为空,则类中有3条相关记录。我什么也得不到。应用程序在这一点上被卡住了。没有进一步的处理。顺便问一下,您是否检查了FindAsync?代码使用wait,而不是紧密循环。无论如何,结果是否不包含任何内容或3条记录?应用程序在哪里卡住了。结果会一直阻塞,直到异步调用完成,但这正是您所要求的。此外,检查任务是否出错也没有意义:。如果出现错误,Result将引发异常。不过,您确实需要了解任务和async\Wait是如何工作的。