Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для sysrepos
85 / 78 / 31
Регистрация: 08.08.2013
Сообщений: 464
Записей в блоге: 1

Как написать делегат вместо лямбда-выражения и анонимного метода

10.11.2016, 15:22. Показов 2408. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь разобраться с делегатами и многопоточностью.
Есть простой проект-пример на WinForms, с прогресбаром и циклом, эмулирующем работу. (во вложении)

Есть в коде некий метод _worker_WorkCompleted, который вызывается при завершении работы

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        void metod1(bool canceled)
        {
            string message = canceled ? "Процесс отменен" : "Процесс завершен";
            MessageBox.Show(message);
            butstart.Enabled = true;
            progressBar2.Style = ProgressBarStyle.Blocks;
            textBox1.AppendText(_worker.report);
        }
        
        delegate void mydel();
 
        private void _worker_WorkCompleted(bool canceled) //  завершение 2
        {
            mydel MyAction = () =>  //лямбда выражение
            {
                metod1(canceled);
            };
            Invoke(MyAction);
        }
В оригинале используется лямбда-выражение. (и встроенный делегат Action)

Вместо лямбда выражения можно так же написать анонимный метод

C#
1
2
3
4
5
            
mydel MyAction = delegate  // анонимный метод
{
metod1(canceled);
};
Если я правильно понял, лямбда-выражения, анонимные методы и просто использование делегата - это всё равнозначные конструкции.
У меня не получилось написать для данного случая просто делегат.
Вопрос вообщем такой: Как в данном случае вместо анонимного метода и лямбда-выражения написать просто делегат?
Вложения
Тип файла: 7z проект.7z (34.5 Кб, 3 просмотров)
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.11.2016, 15:22
Ответы с готовыми решениями:

Разница лямбда выражения, делегата (\анонимного делегата), методом (\анонимных методов)
Всё просто: В чём отличия: лямбд, делегатов, анонимных делегатов, методов, анонимных методов? У меня в проге сучилась такая...

Лямбда-выражения. Как описать лямбда-процедуру и передать в нее файловую переменную?
Погуглив не смогла найти ответов на свои вопросы. Есть следующая процедура, которая находит положительные числа в одном файле и...

Написать программу используя лямбда-выражения
Задано число x. Написать программу, проверяющую, верно ли неравенство 10 < x < 30, используя лямбда-выражения

9
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
10.11.2016, 15:55
Вот так:
C#
1
2
3
4
5
private void _worker_WorkCompleted(bool canceled) //  завершение 2
        {
            var method = new Action<bool>(metod1);
            method(canceled);
        }
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
10.11.2016, 16:12
sysrepos, Делегат - это, грубо говоря, ссылка метод. Анонимные методы, лямбда-выражения - это методы. То есть вы можете присвоить (добавить/удалить) делегату метод и только после этого передавать, иначе выдаст исключение, что делегат == null.
C#
1
delegate void MyDelegate (int x, int y);
Это описание конструкции делегата (как у класса). В нем мы описываем сигнатуру методов, которые мы можем присвоить переменным типа MyDelegate. То есть в нашем случае методы ни должны ничего возвращать и принимать два целочисленных аргумента.
после этого в теле метода мы можем уже инициализировать переменные типа MyDelegate:
C#
1
2
3
4
5
6
7
8
MyDelegate myDelegate = (x,y) => {};
myDelegate += delegate{};
myDelegate += Calculate;
 
private void Calculate(int x, int y)
{
   MessageBox.Show($"{x+y}");
}
и после этого переменную myDelegate можно использовать.
0
 Аватар для sysrepos
85 / 78 / 31
Регистрация: 08.08.2013
Сообщений: 464
Записей в блоге: 1
10.11.2016, 16:18  [ТС]
IamRain, вставил ваш код в программу

C#
1
2
3
            var method = new Action<bool>(metod1);
            method(canceled);
            Invoke(method);
выдает исключение
Дополнительные сведения: Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'butstart' не из того потока, в котором он был создан.
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
10.11.2016, 16:20
Invoke то вызывать не надо, удалите эту строчку. Вы вызываете метод через делегат 2-ой строчкой.
0
 Аватар для sysrepos
85 / 78 / 31
Регистрация: 08.08.2013
Сообщений: 464
Записей в блоге: 1
10.11.2016, 16:22  [ТС]
IamRain, без Invoke вылетает тоже самое исключение
0
 Аватар для IamRain
4694 / 2702 / 734
Регистрация: 02.08.2011
Сообщений: 7,233
10.11.2016, 16:47
sysrepos, видимо метод _worker_WorkCompleted работает в потоке пула(1), а не в GUI потока, либо делегат выполняется в потоке пула (2), а доступ из них к контролам запрещен.
Если я прав, то:
1. Либо используйте progressBar2.Invoke
2. Либо SyncronizationContext.Post
Да и вообще, если (2), то зачем вам понадобилось вызывать делегат, можно просто вызвать метод. Зачем мудрить?
0
 Аватар для sysrepos
85 / 78 / 31
Регистрация: 08.08.2013
Сообщений: 464
Записей в блоге: 1
10.11.2016, 17:15  [ТС]
хочу разобраться с делегатами, анонимными методами и лямбда-выражениями.
Как для данного случая использовать 2 и 3 я понял, а как должен выглядеть делегат, пока нет.
0
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
10.11.2016, 17:28
sysrepos, рекомендую этот сайт. Сам на нём нахожу много полезного и довольно понятным языком. Например, делегаты.
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
11.11.2016, 00:19
В этом видео можете еще посмотреть про делегаты
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.11.2016, 00:19
Помогаю со студенческими работами здесь

При сравнении экземпляра делегата с именем метода, имя метода преобразуется автоматически в делегат или нет?
Добрый день. Есть несколько вопросов про событий и делегаты: 1) При сравнении экземпляра делегата с именем метода, имя метода...

Возможно ли отписаться от анонимного метода?
private void AddNewPictureBox(int x, int y) { pictBox.MouseDown += delegate(object sender, MouseEventArgs e) ...

Возвращение значения из анонимного метода
Как вернут значение из анонимных методов returnRate = d;? Или какой иной подход использовать? using SocketIOClient; using System; ...

Верно ли, что, чтобы передать лямбда выражение в качестве параметра, нужно использовать делегат?
Здравствуйте. Правильно ли я понимаю, что, чтобы передать функцию или лямбда выражение в качестве параметра, нужно использовать делегат?

Счётчик внутри анонимного метода. Непонятное поведение
Здравствуйте. Почему выводит 0, и только если раскомментировать строку, выведет 1? using System.Collections.Generic; using System; ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
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. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru