我试图通过以下代码同步从类中获取和对象:
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());
}
});
由于
答案 0 :(得分:5)
你遇到了经典的异步死锁。您正在调用的异步代码本身在某处(或等效的)调用await
,它是调度将在捕获的同步上下文中运行的延续。您正在使用busywait阻止该上下文(或者甚至是非繁忙的等待,当您尝试这样做时)。在让它运行之前,异步操作无法完成,并且在完成之前不会让它运行。死锁。
到目前为止,最好的选择是使这个方法实际上是异步的。如果你使用任何异步,你应该“一直异步”并使一切异步。如果您不愿意这样做,那么只需使用同步方法而不是异步方法。