2009-11-26 4 views
3

Я хочу систему уведомления о событиях, которая должна уведомить врача, когда сердцебиение пациента превышает 120. Я не знаю, как создать такую ​​систему. Просто я осуществил неправильный. Помогите мне в реализации правильного.C# - Соображения о событиях

 static void Main() 
    { 
    Patient[] patList = { new Patient 
    { PatientID = "1", HeartBeat = 100 }, 
     new Patient { PatientID = "2", HeartBeat = 130 } }; 

     List<Patient> plist = patList.ToList(); 
     Console.ReadKey(true); 
    } 


public class Doctor 
    { 
     public event PulseNotifier AbnormalPulseRaised; 
     public string Name 
     { 
      get; 
      set; 
     } 
    } 



public class Patient 
    { 
     public event PulseNotifier AbnormalPulseRaised; 
     static Random rnd = new Random(); 

     public Patient() 
     { 
      PulseNotifier += new PulseNotifier(OnAbnormalPulseRaised); 
     } 
     public string PatientID 
     { 
      get; 
      set; 
     } 

     public int HeartBeat 
     { 
      get; 
      set; 
     } 

     public void HeartBeatSimulation(List<Patient> patList) 
     { 
      foreach(Patient p in patList) 
      { 
       if (p.HeartBeat > 120) 
       { 
        if (AbnormalPulseRaised != null) 
        { 
         AbnormalPulseRaised(p); 
        } 
       } 
      } 
     } 

     public void OnAbnormalPulseRaised(Patient p) 
     { 
      Console.WriteLine("Patient Id :{0},Heart beat {1}", 
      p.PatientID, p.HeartBeat); 
     } 
    } 

Помимо этого, я хочу иметь общее разъяснение.

Каков наилучший способ запомнить шаблон издателя и наблюдателя ?. Потому что я довольно смущаюсь о том, где внедрять издателя и где реализовать

ответ

3

Ну, для начала я обычно думаю, что это плохая идея, чтобы слушать события класса в том же классе, если у вас есть к нему доступ.

Это также хорошая идея получить от EventArgs, который рекомендуется MS.

Ответственность за поднятие мероприятия действительно должна быть в самом классе пациента, но здесь вы поднимаете только событие класса, где вы называете функцию HardBeatSimulation, а не на пациента, который на самом деле имеет ненормальный pusle :)

static void Main(string[] args) { 
     Patient pat1 = new Patient(1, 120); 
     Patient pat2 = new Patient(3, 150); // this one can have a 150 bpm hartbeat :) 
     Doctor fancyDoctor = new Doctor(); 
     fancyDoctor.AddPatient(pat1); 
     fancyDoctor.AddPatient(pat2); 
     Console.ReadKey(true); 

    } 

    public class Doctor { 
     List<Patient> _patients; 
     public event EventHandler Working; 


     public Doctor() { 
      _patients = new List<Patient>(); 
     } 

     public void AddPatient(Patient p) { 
      _patients.Add(p); 
      p.AbnormalPulses += new EventHandler<AbnormalPulseEventArgs>(p_AbnormalPulses); 
     } 

     void p_AbnormalPulses(object sender, AbnormalPulseEventArgs e) { 
      OnWorking(); 
      Console.WriteLine("Doctor: Oops, a patient has some strange pulse, giving some valium..."); 
     } 

     protected virtual void OnWorking() { 
      if (Working != null) { 
       Working(this, EventArgs.Empty); 
      } 
     } 

     public void RemovePatient(Patient p) { 
      _patients.Remove(p); 
      p.AbnormalPulses -= new EventHandler<AbnormalPulseEventArgs>(p_AbnormalPulses); 
     } 
    } 

    public class Patient { 
     public event EventHandler<AbnormalPulseEventArgs> AbnormalPulses; 

     static Random rnd = new Random(); 
     System.Threading.Timer _puseTmr; 
     int _hartBeat; 

     public int HartBeat { 
      get { return _hartBeat; } 
      set { 
       _hartBeat = value; 
       if (_hartBeat > MaxHartBeat) { 
        OnAbnormalPulses(_hartBeat); 
       } 
      } 
     } 

     protected virtual void OnAbnormalPulses(int _hartBeat) { 
      Console.WriteLine(string.Format("Abnormal pulsecount ({0}) for patient {1}", _hartBeat, PatientID)); 
      if (AbnormalPulses != null) { 
       AbnormalPulses(this, new AbnormalPulseEventArgs(_hartBeat)); 
      } 
     } 

     public Patient(int patientId, int maxHartBeat) { 
      PatientID = patientId; 
      MaxHartBeat = maxHartBeat; 
      _puseTmr = new System.Threading.Timer(_puseTmr_Tick); 

      _puseTmr.Change(0, 1000); 
     } 

     void _puseTmr_Tick(object state) { 
      HartBeat = rnd.Next(30, 230); 
     } 

     public int PatientID { 
      get; 
      set; 
     } 

     public int MaxHartBeat { 
      get; 
      set; 
     } 
    } 

    public class AbnormalPulseEventArgs : EventArgs { 
     public int Pulses { get; private set; } 
     public AbnormalPulseEventArgs(int pulses) { 
      Pulses = pulses; 
     } 
    } 
+0

@Stormenet Не возбуждается событие. – user215675

+0

Хорошо, теперь это работает, необходимо использовать System.Threading.Timer вместо System.Windows.Forms.Timer, так как не существует цикла приложения :) – Stormenet

2

Метод OnAbnormalPulseRaised (Patient p) должен быть помещен в класс Doctor, потому что врач уведомляется о событии. Свойство события должно быть помещено в класс пациента, потому что пациенты поднимают события:

public class Doctor 
{ 
     public Doctor() 
     { 
      // doctor initialization - iterate through all patients 
      foreach(patient in patList) 
      { 
       // for each patient register local method as event handler 
       // of the AbnormalPulseRaised event. 
       patient.AbnormalPulseRaised += 
        new PulseNotifier(this.OnAbnormalPulseRaised); 

      } 
     } 

     public void OnAbnormalPulseRaised(Patient p) 
     { 
      Console.WriteLine("Patient Id :{0},Heart beat {1}", 
      p.PatientID, p.HeartBeat); 
     } 


     public string Name 
     { 
      get; 
      set; 
     } 
} 

public class Patient 
{ 
     public event PulseNotifier AbnormalPulseRaised; 
     static Random rnd = new Random(); 

     public Patient() 
     { 
     } 

     public string PatientID 
     { 
      get; 
      set; 
     } 

     public int HeartBeat 
     { 
      get; 
      set; 
     } 

     public void HeartBeatSimulation(List<Patient> patList) 
     { 
      foreach(Patient p in patList) 
      { 
       if (p.HeartBeat > 120) 
       { 
        if (AbnormalPulseRaised != null) 
        { 
         AbnormalPulseRaised(p); 
        } 
       } 
      } 
     } 
    } 

Издатель - объект с собственностью события. Абонент - это объект с методом обработчика.

Смежные вопросы