Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
8 / 7 / 3
Регистрация: 24.12.2019
Сообщений: 142

Создание события для метода

17.09.2022, 19:54. Показов 1202. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, такая ситуация, есть метод который принимает int значение и начинает обрабатывать данные, через некоторое время он может выдать ответ в виде string. я хочу засунуть это в класс и вызывать его так:
C#
1
MessageHandler.OnSingleCommand += CommandListener_OnSingleCommand;
Код нашёл в проекте другого человека, но я не смог разобраться откуда куда. я выяснил что это "где-то" в делегатах. шарясь в интернете не смог найти подходящие, вот пример метода который будет думать и выдавать данные(это только шаблон):
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
        internal string MyMethod(int len)
        {
            Random ran = new Random();
            int i = 0;
            while (true)
            {
                i++;
                if (ran.Next(0, 100) == len)
                {
                    return $"угадал спустя {i} попыток";
                }
            }
        }
Кто нибудь из вас знает как это сделать так что бы создать событие передав данные и если он получит результат он запустил метод и передал созданные данные ему
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.09.2022, 19:54
Ответы с готовыми решениями:

Создание события для элемента
Доброый вечер. Дело в том что создал в программе массив pictureboxов, каждый выводится в форму во время работы программы. Как создать...

Создание юнит теста для метода
Есть метод который кидает исключение при отриц. значении if (radius > 0) { return Math.PI...

Создание отдельного потока для метода
Как создать отдельный поток для этого метода, мальчики ? public void SetBrightness(int brightness) { Bitmap temp =...

8
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
17.09.2022, 21:43
Цитата Сообщение от иван2020 Посмотреть сообщение
как это сделать так что бы создать событие передав данные и если он получит результат он запустил метод и передал созданные данные ему
Не очень понятно. Событие-то когда должно происходить?
0
8 / 7 / 3
Регистрация: 24.12.2019
Сообщений: 142
18.09.2022, 07:24  [ТС]
John Prick, желательно там где написано "return". Просто функция для запуска нужны значения из-вне (пользователь прописывает), запускает и функция начинает работать в бесконечном цикле и может n-раз через n-времени выдавать результат. Мне надо что бы эта функция каждый раз как получает данные триггерила другую функцию передав при этом данные.
0
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
18.09.2022, 09:28
Цитата Сообщение от иван2020 Посмотреть сообщение
Мне надо что бы эта функция каждый раз как получает данные триггерила другую функцию передав при этом данные.
Всё равно не очень понял. Так что ли?

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 Generator
    {
        public event Action<int> NumberGenerated;
 
        internal string MyMethod(int len)
        {
            Random ran = new Random();
            int i = 0;
            while (true)
            {
                i++;
                int num = ran.Next(0, 100);
 
                if (NumberGenerated != null)
                    NumberGenerated(num); // вызов события
 
                if (num == len)
                {
                    return $"угадал спустя {i} попыток";
                }
            }
        }
    }
 
// ...
 
    private void CommandListener_OnSingleCommand(int num)
    {
        Console.WriteLine($"Сгенерировано: {num}");
    }
 
    Generator gen = new Generator();
    gen.NumberGenerated += CommandListener_OnSingleCommand;
    gen.MyMethod(100500);
2
2287 / 1603 / 400
Регистрация: 26.06.2017
Сообщений: 4,748
Записей в блоге: 1
18.09.2022, 10:53
Лучший ответ Сообщение было отмечено иван2020 как решение

Решение

John Prick, я понял немного не так, вот чуть исправленный код.
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
    class Generator
    {
        public delegate void NumberGeneratedHandler(string message);
        public event NumberGeneratedHandler NumberGenerated;
 
        internal string MyMethod(int len)
        {
            Random ran = new Random();
            int i = 0;
            while (true)
            {
                i++;
                int num = ran.Next(0, 100);
  
                if (num == len)
                {
                    if (NumberGenerated != null)
                        NumberGenerated($"угадал спустя {i} попыток"); // вызов события
                }
            }
        }
    }
 
// ...
 
    private void CommandListener_OnSingleCommand(string message)
    {
        Console.WriteLine(message);
    }
 
    Generator gen = new Generator();
    gen.NumberGenerated += CommandListener_OnSingleCommand;
    gen.MyMethod(100500);
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,110
Записей в блоге: 2
18.09.2022, 12:13
Цитата Сообщение от John Prick Посмотреть сообщение
C#
14
15
      if (NumberGenerated != null)
          NumberGenerated(num); // вызов события
Лучше так:
C#
14
      NumberGenerated?.Invoke(num); // вызов события
Добавлено через 2 минуты
Цитата Сообщение от Uswer Посмотреть сообщение
C#
1
2
3
    class Generator
    {
        public delegate void NumberGeneratedHandler(string message);
В современном Шарпе публичные вложенные типы не используются.
Поэтому лучше так:
C#
1
2
3
    public delegate void NumberGeneratedHandler(string message);
    public class Generator
    {
Добавлено через 18 минут
Цитата Сообщение от иван2020 Посмотреть сообщение
такая ситуация, есть метод который принимает int значение и начинает обрабатывать данные, через некоторое время он может выдать ответ в виде string. я хочу засунуть это в класс и вызывать его так:
Типичными для современного Шарпа являются такие реализации (концептуально, в упрощенном виде):
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
    // Отдельные события для каждого свойства
    public class SomeClass
    {
        private string? _text;
        private string? _description;
 
        public string? Text
        {
            get => _text; private set
            {
                _text = value;
                TextChanged?.Invoke(this, EventArgs.Empty);
            }
        }
        public event EventHandler? TextChanged;
        public string? Description
        {
            get => _description; set
            {
                _description = value;
                DescriptionChanged?.Invoke(this, EventArgs.Empty);
            }
        }
        public event EventHandler? DescriptionChanged;
 
        public void SomeMethod(int len)
        {
            // Some Code
 
            Text = "Some Result";
 
            // Some Code
        }
    }
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
    // Общее событие для всех свойств
    public class SomeClassINPC : INotifyPropertyChanged
    {
        #region Реализация INPC
        /// <inheritdoc cref="INotifyPropertyChanged"/>
        public event PropertyChangedEventHandler? PropertyChanged;
 
        protected void RaisePropertyChanged([CallerMemberName] string? propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName ?? string.Empty));
        }
        protected bool Set<T>(ref T propertyField, T newValue, [CallerMemberName] string? propertyName = null)
        {
            bool isNotEquals = !Equals(propertyField, newValue);
            if (isNotEquals)
            {
                propertyField = newValue;
                RaisePropertyChanged(propertyName);
            }
 
            return isNotEquals;
        }
        #endregion
 
        private string? _text;
        private string? _description;
 
        public string? Text { get => _text; private set => Set(ref _text, value); }
        public string? Description { get => _description; set => Set(ref _description, value); }
 
        public void SomeMethod(int len)
        {
            // Some Code
 
            Text = "Some Result";
 
            // Some Code
        }
    }
1
2394 / 1923 / 763
Регистрация: 27.07.2012
Сообщений: 5,567
18.09.2022, 13:11
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Лучше так
Да, я знаю. Но новичку это может показаться непонятным.
0
8 / 7 / 3
Регистрация: 24.12.2019
Сообщений: 142
18.09.2022, 19:27  [ТС]
Цитата Сообщение от Uswer Посмотреть сообщение
я понял немного не так, вот чуть исправленный код.
Спасибо большое, я именно это и искал, я долгое время пытался найти что то похожее, но не мог. Спасибо вам ещё раз.

Добавлено через 4 минуты
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Лучше так:
Ваш код я тоже учту и постараюсь разобраться в нём

Цитата Сообщение от Элд Хасп Посмотреть сообщение
Типичными для современного Шарпа являются такие реализации (концептуально, в упрощенном виде):

Не по теме:

Ох боже мой, это что за письмена. Я чёт не могу понят что-за что отвечает, у меня ещё много что узнать надо оказывается

0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,110
Записей в блоге: 2
18.09.2022, 19:48
Цитата Сообщение от иван2020 Посмотреть сообщение
Я чёт не могу понят что-за что отвечает, у меня ещё много что узнать надо оказывается
Если посмотрите как используются события, то увидите, что в них всегда есть параметр sender.
В нём передаётся источник события.
Например у вас два разных объекта с одним и тем же событием.
Вы делаете для них один обработчик.
Но вам же нужно различать какой из объектов вызвал обработчик.
Вот для этого и служит sender.

В .Net предусмотрены стандартные делегаты для событий с sender: EventHandler и EventHandler<T>.
Первое принимает в параметрах (кроме источника события) ещё и аргумент типа EventArgs.
Второе может принять аргумент любого типа, но рекомендуется для аргумента создавать класс производный от EventArgs.

C#
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
        // Поле хранящее значение свойства. К нему можно обращаться только в теле свойства.
        private string? _text;
 
        // Свойство. В современном Шарпе публичные поля не используются. 
        public string? Text
        {
            // Геттер свойства - возвращает значение свойства.
            // Кроме обращения к переменной свойства сюда редко что пишется.
            get => _text; 
 
            // Сеттер свойства.
            // Его логика обеспечивает автоматическое поднятие
            // события извещающего об изменении свойства.
            private set
            {
                // Запоминание полученного значения в поле.
                _text = value;
 
                // Проверка события на подписчиков.
                // И, если они есть, то поднятие события.
                TextChanged?.Invoke(this, EventArgs.Empty);
            }
        }
 
        // Событие. "Снаружи" класса на него можно только подписаться-отписаться.
        public event EventHandler? TextChanged;
Добавлено через 1 минуту
Реализация INPC - это уже отдельная тема.
Когда разберётесь с более простым, то смогу и это объяснить.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.09.2022, 19:48
Помогаю со студенческими работами здесь

Создание метода для поиска по классу
Привет всем, возникла такая проблема: нужно написать программу в которой создавался бы класс &quot;город&quot; и класс &quot;область&quot;...

Создание собственного атрибута для метода
Задача: Чат клиент - сервер. Клиент отправляет команду &quot;/ShowUsers&quot;, сервер во время обработки входящих сообщений определяет что это...

Создание динамического события для объекта подключаемого из dll (динамика)
Всем привет, помогите. мучаюсь уже битый час... \ Суть такова. есть главная форма, у нее есть метод View, из подключаемой библиотеке...

Вызов асинхронного метода из события
Присваиваю событию ссылку на метод _mainView.StartBinaryTradeClickEventRaised += new EventHandler(OnStartBrTradeClickEventRaised); ...

Как отписаться от события внутри метода?
Как отписаться от события внутри метода? private void FFF() { systems.Test += (Sostojanie) =&gt; { //здесь необходимо...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru