private void TimerCounter() { Thread.Sleep(Time); MailInfo mailInfo = new MailInfo() { From = "Timer", To = "User", Message = "Timer finished work" }; NewMail?.Invoke(this, mailInfo); timerThread.Abort(); }
//Step 3: //Method Responsible for Raising Event (Notify registered objects that event occurred) //by convention protected virtual void (so inheritance is possible, if class is sealed - private, nonvirtual) protected virtual void OnNewMail(MailEventArgs e) { //variant 1 //not thread safe //if (NewMail != null) NewMail(this, e); //variant 2 //Thread safe in theory but compiler could optimize it //EventHandler<MailEventArgs> TempNewMail = NewMail; //if (TempNewMail != null) TempNewMail(this, e); //variant 3 //according to Rihter //EventHandler<MailEventArgs> TempNewMail = Volatile.Read(ref NewMail); //if (TempNewMail != null) TempNewMail(this, e); //variant 4 //according to C#6.0 - it is thread safe NewMail?.Invoke(this, e); }
public virtual void OnNewMail(NewMailEvent e) { NewMail?.Invoke(this, e); }
/// <summary> /// Notifies all subscrbers. /// </summary> protected virtual void OnNewMail(DataEventArgs info) => NewMail?.Invoke(this, info);
protected virtual void OnNewMail(MailMessage mail) { NewMail?.Invoke(mail); }
/// <summary> /// Notifies all observers. /// </summary> protected virtual void OnNewMail(WeatherInfoEventArgs info) { NewMail?.Invoke(this, info); }
protected virtual void OnNewMail(NewMailEventArgs e) { NewMail?.Invoke(this, e); }