编写EventHandler来管理C#中的连接

时间:2017-08-02 01:48:35

标签: c#

 public class RSensor : IRSensor
 {
        public RSensorType SensorType { get; protected set; }


        public event EventHandler ConnectionLost;

        public void Configure(Stream input, Stream output, RSensorType type, ISensorReciever reciever)
        {
            throw new NotImplementedException();
        }


        public RSensor()
        {

        }
}

我有一个类RSensor,它有一个EventHandler ConnectionLost,会在连接断开时通知我。

我有另一个类ConnectionManager,在连接断开时需要以某种方式处理。我创建了一个虚函数void HandleConnectionLost() 在这堂课上。当触发EventHandler ConnectionLostRSensor时,如何触发此功能。

public class ConnectionManager
{
        ActiveList m_ActiveList;
        Dictionary<IRionSensor, VSManager> m_ConnectionManager;

        class VehicleStreamManager
        {
            public IVehicle Vehicle { get; set;  }
            public NetworkStream AStream { get; set; }
            public NetworkStream BStream { get; set; }
        }

        ConnectionManager(ActiveExercise exercise)
        {
            m_ActiveList = exercise;
            m_ConnectionManager = new Dictionary<IRSensor, VehicleStreamManager>();
        }

        void Connect()
        {
            List<VehicleStreamManager> vsmList;
            VehicleStreamManager vsm;


            vsm = InitiateAVehicleConnections();

            m_ConnectionManager.Add(null, vsm);


            vsmList = InitiateBVehicleConnections();

            foreach(var item in vsmList)
            {
                RSensor fsensor = new RSensor();
                fsensor.Configure(item.AStream, item.BStream, RSensorType.RSensor_Both, null);
                m_ConnectionManager.Add(fsensor, item);
            }
        }

        void HandleConnectionLost()
        {
            //Do some stuff
        }


   }
}

1 个答案:

答案 0 :(得分:1)

您需要稍微重新定义HandleConnectionLost处理程序,以使其符合EventHandler签名:

void HandleConnectionLost(object sender, EventArgs args) 
{
  // Do stuff here
}

然后,在实例化传感器的ConnectionManager循环中,您需要连接事件处理程序:

foreach(var item in vsmList)
{
    RSensor fsensor = new RSensor();
    fsensor.Configure(item.AStream, item.BStream, 
      RSensorType.RSensor_Both, null);
    fsensor.ConnectionLost += HandleConnectionLost;
    m_ConnectionManager.Add(fsensor, item);
}

这样,只要其中一个传感器失去连接,就会触发处理程序。

您没有显示执行此操作的代码,但您说ConnectionLost事件会在连接断开时通知我。我认为这意味着存在已经引发事件的代码。如果没有,请告诉我,我将扩展这个例子。

但是,传感器必须依赖某种类型的连接丢失外部通知 - 它可能依赖于较低级别的基础架构。