Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 30.01.2014
Сообщений: 148

Пояснить суть и назначение событий, желательно на примере

14.02.2014, 12:07. Показов 1794. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Попробовал почитать про события и вообще не понятно с чем их есть и как их применять.
Может быть кто то напишет на маленьком примере как работать с событиями. Например счетчик, который при значении переменной 100 вызовет метод в котором выведет на экран Console.WriteLine(" Куку! уже 100!");
На сколько я понимаю интуитивно должно быть несколько блоков - блок счетчика,блок подписки на изменения значения которого пишутся в некую переменную и блок отработки события.

И не очень понятна структура. Если в обычной программе у нас методы в классе и мы вызываем класс и метод, то события это какой то отдельный класс, который надо вызывать?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.02.2014, 12:07
Ответы с готовыми решениями:

Пояснить суть оператора >>
Что делают два знака больше? ">>" ... двоеточие? ":" Вопросительный знак? uint crc; for (uint i = 0; i < 256; i++) ...

Поразрядные операторы - их суть и назначение
Господа, подскажите пожалуйста, что делают поразрядные операторы, если можно, то пожалуйста на пальцах, ибо дошел по шилдту до этого и...

Каковы суть и назначение ref и out
Читал книги, юзал msdn, но все равно не смог понять про операторы ref и out, точнее про ref немножко понял.

16
 Аватар для Монфрид
1245 / 1055 / 293
Регистрация: 07.03.2012
Сообщений: 3,246
14.02.2014, 13:55
ну это наверно одна из самых сложных тем в .net программировании, с ходу её понять мало кому удаётся.
События применяются для уведомления что что-то произошло.
Типичный пример: допустим имеется некий класс, который выполняет какие то сложные операции, операции эти выполняются долго. Класс этот вызывается вызывается откуда то из программы, и этой программе нужно знать за ходом выполнения операции (сколько %выполнено например). Вот тут и нужны события для уведомления
1
 Аватар для dirtez0
44 / 44 / 19
Регистрация: 20.01.2014
Сообщений: 87
14.02.2014, 14:29
Цитата Сообщение от roma095 Посмотреть сообщение
Попробовал почитать про события и вообще не понятно с чем их есть и как их применять.
Нужно перейти на новый уровень мышления, мыслить абстрактно. Если представить концепцию событий в абстрактной форме, то всё становится очень легко. Одно слово событие сколько в себе информации несёт. Не нужно вдаваться в мельчайшие детали если пока не понятно, сначала понять саму суть, как работает в самом общем виде, затем не торопясь детализировать понимание до самых мельчайших деталей. Вы же работу автомобиля не описываете как - эм, ну... вот тут бензин по вот этой трубе течёт, тут форсунка заталкивает бензин в цилиндр ... Блин, а зачем по этой трубке, зачем в этом направлении... и т.п. Вы просто говорите что это механизм который может передвигаться по земле используя топливо.

Не по теме:

Напоследок Вам притча ;)

Два дровосека как-то поспорили, кто из них нарубит больше леса за один день. С утра они заняли свои места и принялись рубить. Но через час один перестал работать и присел на пенек. Другой лесоруб, немного подивившись, продолжил с удвоенной силой.

Прошло десять минут, и он услышал, что второй дровосек снова принялся за работу. И снова они работали почти синхронно, как вдруг первый лесоруб опять услышал, как его противник снова остановился. Вновь дровосек обрадовано принялся за работу, уже ощущая запах победы. И так продолжалось целый день.

Каждый час один из лесорубов останавливался на десять минут, а второй продолжал . Когда начало смеркаться, дровосеки прекратили рубить. Тот, что работал не переставая, был совершенно уверен — он победил, но каково же было его удивление, когда он узнал, что ошибся.

— Как это получилось? — спросил он своего напарника. — Каждый час я слышал, как ты на десять минут прекращаешь работу. Как ты умудрился нарубить больше дерева, чем я? Это невозможно! Ведь я работал с удвоенной силой!

— Всё очень просто, — ответил тот. — Каждый час я останавливался на десять минут. И в то время, как ты продолжал рубить лес, я точил свой топор.

2
 Аватар для Kruds
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
14.02.2014, 14:59
Лучший ответ Сообщение было отмечено roma095 как решение

Решение

Пример с циклом
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Program
{
    static void Main(string[] args)
    {
        ClassWithEvent obj = new ClassWithEvent();
        obj.LoopEvent += Handler; //подписка на событие
        obj.Loop();
        Console.Read();
    }
 
    /// <summary>
    /// Метод для обработки события.
    /// (!) Сигнатура метода Handler соответствует делегату SimpleDelegate, базовому для события LoopEvent
    /// </summary>
    /// <param name="message">Параметр переданный событием в обработчик</param>
    static void Handler(string message)
    {
        Console.WriteLine(message);
    }
 
}
 
public class ClassWithEvent
{
    public delegate void SimpleDelegate(string message);
    public event SimpleDelegate LoopEvent;
 
    public void Loop()
    {
        for (int i = 0; i < 100; Console.WriteLine(i++));
        if (LoopEvent != null)
            LoopEvent("Цикл завершен!");
    }
}
1
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
14.02.2014, 16:29
Назначение событий - избежать утечки памяти в делегатах и инкапсуляция
1
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
14.02.2014, 16:37
Цитата Сообщение от DataPlanner Посмотреть сообщение
Назначение событий - избежать утечки памяти в делегатах и инкапсуляция
События вообще удобная штука... Писал программку, в классе работает цикл, и хотелось по каждой итерации выводить процесс на прогрессбар формы. Так вот без событий ничего бы не вышло... А с событиями-легко, и включение прогресса, и шаг, и отключение.
0
1 / 1 / 0
Регистрация: 30.01.2014
Сообщений: 148
14.02.2014, 17:04  [ТС]
События должны идти в отдельном потоке?

Еще пример по приведенному выше коду - вместо счетчика в LOOP вставил DateTime.Now
В результате время отображается на экране только один раз. Но ведь время же меняется по сути
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
14.02.2014, 17:14
Не обязательно в потоке. Это зависит от того, сильно ли Ваш код тормозит форму или нет. Сейчас сделаю пример с событием.

Добавлено через 8 минут
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
 
namespace roma095
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            button1.Click+=new EventHandler(button1_Click);
        }
        void button1_Click(object sender, EventArgs e)
        {
            MyClass mc = new MyClass();
            mc.MyEvent+=new Action(mc_MyEvent);
            mc.Start();
        }
        void mc_MyEvent()
        {
            MessageBox.Show("Еще одно событие!", "Event");
        }
    }
 
    class MyClass
    {
        public event Action MyEvent;
 
        public void Start()
        {
            for (int i = 0; i < 1000; i++)
            {
                if (MyEvent != null)
                    MyEvent();
                Thread.Sleep(5000);
            }
        }
    }
}
Как-то так. Каждые 5 сек в объекте класса генерируется событие, на которое подписана основная форма. Обработчик события по возникновению события выводит сообщение.
0
 Аватар для Nevermore_
74 / 74 / 30
Регистрация: 22.03.2013
Сообщений: 224
14.02.2014, 17:27
А если реализация событий посмотреть с низкого уровня. То это бесконечный цикл который обрабатывает очередь которая выстраивает операционная система.
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
14.02.2014, 20:06
Цитата Сообщение от Nevermore_ Посмотреть сообщение
А если реализация событий посмотреть с низкого уровня. То это бесконечный цикл который обрабатывает очередь которая выстраивает операционная система.
Это откуда такие познания?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
14.02.2014, 20:09
Цитата Сообщение от DataPlanner Посмотреть сообщение
Назначение событий - избежать утечки памяти в делегатах и инкапсуляция
Особенно весело, когда события и приводят к утечке памяти.
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
14.02.2014, 20:30
Как ты думаешь, зачем события всегда проверяют на null?
0
 Аватар для Nevermore_
74 / 74 / 30
Регистрация: 22.03.2013
Сообщений: 224
14.02.2014, 20:56
DataPlanner, Увлекался олькой и асм
0
158 / 187 / 48
Регистрация: 25.11.2013
Сообщений: 978
14.02.2014, 21:17
В том вся и разница, что делегат объявляется на уровне namespace, а event это свойство класса. Разумеется event тоже может вызвать утечку, если мы не удалим ссылку на делегат, но это уже проблема криворукости, для этого и придумали IDisposable

Добавлено через 2 минуты
Цитата Сообщение от Nevermore_ Посмотреть сообщение
Увлекался олькой и асм
Я так понимаю речь идет о цикле приложения, т.е. message loop, события и делегаты это всего лишь ссылки на адрес в памяти
0
 Аватар для Yukikaze
352 / 331 / 49
Регистрация: 12.12.2011
Сообщений: 563
14.02.2014, 23:26
Цитата Сообщение от Nevermore_ Посмотреть сообщение
А если реализация событий посмотреть с низкого уровня. То это бесконечный цикл который обрабатывает очередь которая выстраивает операционная система.
Эээ... что? События - это частный случай паттерна наблюдатель(observer), откуда там бесконечный цикл
0
1 / 1 / 0
Регистрация: 14.02.2014
Сообщений: 5
15.02.2014, 02:21
Может я ошибаюсь, но я понимаю события как пристройку к делегату. Если написать пару примеров с делегатом и понять то события станут понятнее.

Получается если в создаваемом классе в нужном месте нужно запустить метод, только метод не известен, а может он и не один, на ум сразу приходят делегаты, но , видимо из принципов ооп или удобства, делегаты получили пристрой в виде событий.
Т.е. мы строим класс и делегат принимающий нужные аргументы, затем в этом классе создаем событие с типом делегата, а потом вызываем это событие в классе когда надо(через if например), как будто это метод, только не забывая проверить, есть ли что вызывать.(иф событие = нуль)
Причём аргументы событий желательно строить по принципу дефолтных, как в VS при автоматическом создании обработчика нажатия кнопки например.

Значит событие, это такая торчащая из класса ниточка, к которой можно привязывать свои методы чрез += и отвязывать, через -=
жутко удобно получается и не нужно открывать поля и свойства, что бы кто то их проверял через ифы, а может и еще что делал грязное и неправильное.

Правильно я понял, или идти перечитывать?)
0
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
16.02.2014, 17:18
http://msdn.microsoft.com/ru-r... ftdfh.aspx
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.02.2014, 17:18
Помогаю со студенческими работами здесь

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

Каковы суть и назначение Unit Tests
Всем привет! Народ, что такое Юнит тесты? с чем их едят и для чего вообще нужны? Расскажите кому не сложно, киньте ссылок полезных. ...

Делегаты. Ковариантность и контравариантность - какова их суть и назначение
Недавно пересматривал книгу шилдта, а именно делегаты, прочитал пример про ковариантность и контравариантность, в 4 утра у меня вскипел...

Делегаты и их применение, желательно на простом примере
Я читаю книгу М. Фленов - Библия C# и дошел до темы &quot;Делегат&quot; но не как не могу понять (два раза прочитывал эту тему) их применение и...

Распарсить страницу (желательно показать на примере)
Нужно распарсить данную страницу: http://api.own3d.tv/rest/live/list.xml?gameid=605 подскажите лучший способ (желательно с примером), что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в КА2. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа в КА2. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru