2017-08-02 57 views
0
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有一個事件處理程序ConnectionLost當連接出現故障,它將通知我。寫事件處理器來管理連接在C#

我有另一個類ConnectionManager,當連接斷開時需要處理。我在這個類中創建了一個虛擬函數​​ 。如何觸發此功能,當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

您需要稍微重新定義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事件會在連接關閉時通知我。我認爲這意味着有代碼可以提升事件。如果沒有,讓我知道,我會擴展這個例子。

但是,傳感器必須依靠某種外部通知丟失連接 - 它可能會依賴於較低級別的基礎設施。

+0

這裏'對象發件人'是傳感器對象? – liv2hak

+0

@ liv2hak是的。發件人將成爲傳感器。 – Optimax