Ejemplo n.º 1
0
        public void SimulateNewMail(string from, string to, string subject)
        {
            // Проверить входные данные на корректность.

            // Создать объект для хранения информации, которую
            // нужно передать получателям уведомления
            var e = new NewMailEventArgs(from, to, subject);

            // Вызвать виртуальный метод, уведомляющий объект о событии
            // Если ни один из производных типов не переопределяет этот метод,
            // объект уведомит всех зарегистрированных получателей уведомления
            OnNewMail(e);
        }
Ejemplo n.º 2
0
        //private EventHandler<NewMailEventArgs> NewMail = null;

        //public void add_NewMail(EventHandler<NewMailEventArgs> value)
        //{
        //	EventHandler<NewMailEventArgs> prevHandler;
        //	var newMail = NewMail;
        //	do
        //	{
        //		prevHandler = newMail;
        //		var newHandler = (EventHandler<NewMailEventArgs>)Delegate.Combine(prevHandler, value);
        //		newMail = Interlocked.CompareExchange(ref NewMail, newHandler, prevHandler);

        //	}
        //	while(newMail != prevHandler);
        //}

        //public void remove_NewMail(EventHandler<NewMailEventArgs> value)
        //{
        //	EventHandler<NewMailEventArgs> prevHandler;
        //	var newMail = NewMail;
        //	do
        //	{
        //		prevHandler = newMail;
        //		var newHandler = (EventHandler<NewMailEventArgs>)Delegate.Remove(prevHandler, value);
        //		newMail = Interlocked.CompareExchange(ref NewMail, newHandler, prevHandler);

        //	}
        //	while(newMail != prevHandler);
        //}
        #endregion
        protected virtual void OnNewMail(NewMailEventArgs e)
        {
            //_ = e ?? throw new ArgumentNullException(nameof(e));

            // Вариант 1
            // Может быть уязвимость при многопоточности
            //NewMail?.Invoke(this, e);

            // Вариант 2
            // Решает проблему, но поведение компилятора может измениться
            var temp = NewMail;

            temp?.Invoke(this, e);

            // Сохранить ссылку на делегата во временной переменной
            // для обеспечения безопасности потоков
            //Volatile.Read(ref NewMail)?.Invoke(this, e);
        }
Ejemplo n.º 3
0
 private static void MailManagerNewMail(object sender, NewMailEventArgs e)
 {
 }
Ejemplo n.º 4
0
 private void OnNewMailEvent(object sender, NewMailEventArgs e)
 {
     Console.WriteLine("Получено новое сообщение. Выводим на печать:");
     Console.WriteLine($"Письмо от {e.From} для {e.To}.");
     Console.WriteLine(e.Subject);
 }
Ejemplo n.º 5
0
 public void MmNewMail(object sender, NewMailEventArgs e)
 {
     Console.WriteLine($"{sender} {e.From}");
 }