我想在返回包含函数之前等待我的监听器完成。
考虑这个功能:
public static Users GetUser(string sUserID)
{
Users oUser = null;
var listener = new UserEventHelper((sender, e) =>
{
if ((e as UserArgs).Value != null)
{
oUser = (e as UserArgs).Value;
}
});
oRoot.Child("users").OrderByKey().EqualTo(sUserID).AddListenerForSingleValueEvent(listener);
return oUser;
}
其他课程:
class UserEventHelper : Java.Lang.Object, IValueEventListener
{
EventHandler OnChange;
public UserEventHelper(EventHandler OnChange)
{
this.OnChange = OnChange;
}
public void OnCancelled(DatabaseError error)
{
//throw new NotImplementedException();
}
public void OnDataChange(DataSnapshot snapshot)
{
if (OnChange != null && snapshot.Value != null)
{
Users oUser = JsonConvert.DeserializeObject<Users>(snapshot.Value.ToString());
OnChange.Invoke(this, new UserArgs(oUser));
}
else
{
OnChange.Invoke(this, new UserArgs(null));
}
}
}
public class UserArgs : EventArgs
{
public UserArgs(Users value)
{
this.Value = value;
}
public Users Value { get; set; }
}
如何以这样一种方式构造我的代码:我知道在从函数返回之前从侦听器内部设置了用户值?注意:代码可能存在其他问题,但我想关注这个概念性问题。
答案 0 :(得分:0)
我无法想到从GetUser方法返回一个对象的方法,这个方法只是订阅一个事件,并提供一个事件被触发时要采取的行动,并且没有保证何时将触发该事件。
因此它不应该被称为 GetUser ,因为它无法返回用户对象。此外,当事件被多次触发时,您期望该方法返回什么?拿第一个并丢弃其他人?
解决方案是,而不是尝试将用户对象返回到调用者,而只是在您订阅时提供的操作(侦听器)内的用户对象上执行任何操作。事件。
var listener = new UserEventHelper((sender, e) =>
{
if ((e as UserArgs).Value != null)
{
oUser = (e as UserArgs).Value;
//you have a user object now, just do your work here!
}
});