Friday, March 4, 2011

События


События (event) это почти делегаты, только используется ключевое слово event, что позволяет редактору Visual Studio правильно распределять их по закладкам окна свойств.

Описание класса, использующего события:
namespace EventTest
{
    /// <summary>
    /// Тип метода
    /// </summary>
    public delegate void Progress(int progress);

    public class Parser
    {
        /// <summary>
        /// Описываем событие
        /// </summary>
        public event Progress ProgressHandler;

        /// <summary>
        /// Основной метод
        /// </summary>
        public void Calc()
        {
            for (int i = 0; i < 100; i++)
            {
                // Если обработчик задан - вызываем его
                if (ProgressHandler != null)
                    ProgressHandler(i+1);
            }
        }
    }
}

Использование этого класса:
namespace EventTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // Создаем экземпляр
            Parser parser = new Parser();
            // Вешаем обработчик
            parser.ProgressHandler += new Progress(parser_ProgressHandler);
            // Можно и два метода обработки одного события
            parser.ProgressHandler+=new Progress(parser_ProgressHandlerSecond);
            // Можно описывать обработчики "по месту", хотя это не всегда удобно
            parser.ProgressHandler+= delegate(int progress)
            {
                Console.WriteLine("inline:" + progress);
            };

            // Вызываем метод
            parser.Calc();
        }

        /// <summary>
        /// Этот метод будет вызываться при обработке события
        /// </summary>
        static void parser_ProgressHandler(int progress)
        {
            Console.WriteLine("first:" + progress);
        }

        /// <summary>
        /// Можно вешать и два метода
        /// </summary>
        static void parser_ProgressHandlerSecond(int progress)
        {
            Console.WriteLine("second:" + progress);
        }
    }
}

2 comments:

Dmitry Ornatsky said...

if (ProgressHandler != null)
ProgressHandler(i+1);

Не тред-сейфно )

Pavel Agurov said...

Дим, это же для студентов :) Мы потоки еще не проходили.