//Этап 3: Определение метода, ответственного за уведомление зарегистрированных объектов о событии //(Для изолированного класса метод будет закрытый и невиртуальный) protected virtual void OnNewMail(NewMailEventArgs e) { ////для синхронизации потоков ////EventHandler<NewMailEventArgs> temp = newMail;//возможна оптимизация компилятора! //EventHandler<NewMailEventArgs> temp = Interlocked.CompareExchange(ref NewMail, null, null); ////CompareExchange изменяет ссылку temp на null, если newMail и не трогает ее в противном случае //Потокобезопасный вызов события оставлен на усмотрение разработчиков if (NewMail != null) { // может быть вызвано исключение NullReferenceException в том случае, // если обработчик был удален из списка уже после проверки NewMail(this, e); } }
//MailManager вызывает этот метод для уведомления //объекта Fax о прибытии нового почтового сообщени private void SmsMsg(Object sender, NewMailEventArgs eventArgs) { Console.WriteLine("Smsing mail message:"); Console.WriteLine("From = {0}, To = {1}, Subject = {2}", eventArgs.From, eventArgs.To, eventArgs.Subject); }