从Xamarin中的Parse同步获取对象

时间:2014-01-15 14:43:37

标签: 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(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());
        }
});

由于

1 个答案:

答案 0 :(得分:5)

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

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