如何在返回前等待听众完成

时间:2017-12-01 00:59:04

标签: c#

我想在返回包含函数之前等待我的监听器完成。

考虑这个功能:

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; }
}

如何以这样一种方式构造我的代码:我知道在从函数返回之前从侦听器内部设置了用户值?注意:代码可能存在其他问题,但我想关注这个概念性问题。

1 个答案:

答案 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! 
        }
    });