从Xamarin中的Parse同步获取对象

Bas*_*ZIa 1 c# task-parallel-library async-await parse-platform xamarin

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

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;
Run Code Online (Sandbox Code Playgroud)

但'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());
        }
});
Run Code Online (Sandbox Code Playgroud)

谢谢

Ser*_*rvy 5

你正在遇到经典的异步死锁.您正在调用的异步代码本身正在调用await某个地方(或等效代码),并且它将调度将在捕获的同步上下文中运行的延续.您正在使用busywait阻止该上下文(或者甚至是非繁忙的等待,当您尝试这样做时).在让它运行之前,异步操作无法完成,并且在完成之前不会让它运行.僵局.

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