C# - 检查并通知布尔值已更改

时间:2016-01-21 12:29:42

标签: c# events

美好的一天

我正在努力熟悉事件,我似乎无法理解这个概念,经过相当多的教程和视频后,我仍然迷失方向,因此我将具体说明我的问题。

简而言之,如果ping报告成功,则线程会ping IP,

  

ServerOnline =(ping ==成功)? true:false;

事件监听器应该"听"对于变量变化,获取变量并相应地处理。

基于以下代码的示例将是一个巨大的帮助。

class tcp_connector
{
    bool ServerOnline

    void thread_checkServer()
    {
        //do code
        ServerOnline = true;
        //notify of variable change
    }    
}

class tcp_sender
{
    //when ServerOnline bool = true
    //button.color = color.green;   
}

1 个答案:

答案 0 :(得分:3)

如果event发生如下变化,您可以在tcp_connector中声明ServerOnline

class tcp_connector
{
    // standard event pattern
    public event EnventHandler ServerOnlineChanged;
    protected virtual void OnServerOnlineChanged
    {
        EventHandler handler = ServerOnlineChanged; // for thread safety
        if (handler != null)
            handler(this, EventArgs.Empty);
    }

    private bool _serverOnline;
    public bool ServerOnline // implement as property
    {
        get { return _serverOnline; }
        set {
            if (_serverOnline == value) return;
            _serverOnline = value;
            OnServerOnlineChanged(); // raise event
            }
    }

    void thread_checkServer()
    {
        //do code

        // be sure to use the property ServerOnline, not the
        // field _serverOnline! 
        // the property setter will raise ServerOnlineChangedEvent
        ServerOnline = true;
    }    
}

然后你就可以在event中使用tcp_sender这样的内容:

class tcp_sender
{
    private tcp_connector _connector;

    public tcp_sender()
    {
        _connector = new tcp_connector();
        // subscribe to event
        _connector.ServerOnlineChanged += tcp_connector_ServerOnlineChanged;
    }

    // the event handler for the ServerOnlineChanged event
    private void tcp_connector_ServerOnlineChanged(object sender, EventArgs e)
    {
        if (_connector.ServerOnline)
           button.color = color.green;
    }
}

这不是一个真正的“倾听者”,可以监视您的财产ServerOnline,但通过将其分为字段属性,您可以识别更改并且举起指定的事件。