Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265

Потокобезопасный вызов метода

01.08.2013, 01:19. Показов 4349. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Признаюсь, потокобезопасность и делегаты для меня тёмный лес, поэтому подскажите пожалуйста, когда мне нужно потокобезопасно изменить свойство объекта, я пишу так:
C#
1
2
if (someObject.InvokeRequired)
  someObject.Invoke(new Action<someType>((p) => someObject.someProp = p), value);
Но что-то никак не соображу, что делать, если мне потокобезопасно нужно вызвать метод принимающий несколько параметров?
В частности мне нужно вызвать такой метод:
C#
1
grid.Columns.Add(columnName, headerName);
Как это сделать?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.08.2013, 01:19
Ответы с готовыми решениями:

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что метод не утрачивает связи с базовым...

Вызов методов классов друг у друга (вызов метода из другого класса)
Есть несколько классов, которые могут вызывать методы (функции) друг у друга. Логика: класс1 имеет метод А, класс2 имеет метод Б, класс1...

Вызов переменной метода A из метода В
Добрый день. Подскажите как происходит вызов Например даны два класс А и В, в каждом классе есть Метод 1 и метод 2 class A { void...

22
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.08.2013, 02:47
Predatore, существуют же вроде различные Action<T1,T2,...,Tn>

Добавлено через 39 секунд
А для ГУИ я бы вообще использовал исключительно async/await
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
01.08.2013, 09:56  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Predatore, существуют же вроде различные Action<T1,T2,...,Tn>

Добавлено через 39 секунд
А для ГУИ я бы вообще использовал исключительно async/await
Если я пишу, Action<T1, T2> он сразу ошибку выдаёт: Using the generic type 'System.Action<T>' requires 1 type arguments

А можно примеры рабочего кода, особенно с async/await?
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.08.2013, 12:01
Predatore, http://habrahabr.ru/post/139734/
1
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
01.08.2013, 12:23  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Ничего не понял, кроме того, что нужен новый .net, но у меня так сложилось, что .net 2.0

P.S. Я благодарен за статью и конечно же нужно всё это изучать, но сейчас мне просто нужно вызвать потокобезопасный метод с двумя параметрами. Дайте мне пожалуйста работающий на .net 2.0 пример кода.
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6102 / 4958 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
01.08.2013, 12:25
Predatore, насколько я знаю, Action<T> появился только в .Net 3.5, так что я сильно сомневаюсь, что у вас 2.0
0
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
01.08.2013, 13:01
Вообще у лямбда выражений есть очень приятная (хоть и затратная) штука:
C#
1
2
3
            int x = 5;
            int y = 10;
            Action act = new Action(() => MessageBox.Show((x + y).ToString()));
Ну а во вторых что вам мешает написать один тип который будет вмещать в себя другие параметры?

C#
1
2
3
4
5
6
7
8
9
10
11
            foo f = new foo();
            f.x = 10;
            f.y = 5;
 
            this.Invoke(new Action<foo>((obj) => MessageBox.Show((obj.x + obj.y).ToString())), f);
 
        class foo
        {
            public int x;
            public int y;
        }
Добавлено через 10 минут
А в третьих у меня прекрасно работает Action<T1, T2>.

C#
1
2
3
            int x = 5;
            int y = 10;
            this.Invoke(new Action<int, int>((xParam, yParam) => MessageBox.Show((xParam + yParam).ToString())), x, y);
1
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
01.08.2013, 13:27  [ТС]
Цитата Сообщение от Psilon Посмотреть сообщение
Predatore, насколько я знаю, Action<T> появился только в .Net 3.5, так что я сильно сомневаюсь, что у вас 2.0
И зря сомневаетесь. Можете заглянуть в MSDN, там чёрным по белому написано: "Supported in: 4.5, 4, 3.5, 3.0, 2.0"

Цитата Сообщение от Anklav Посмотреть сообщение
Вообще у лямбда выражений есть очень приятная (хоть и затратная) штука:
C#
1
2
3
            int x = 5;
            int y = 10;
            Action act = new Action(() => MessageBox.Show((x + y).ToString()));
Ну а во вторых что вам мешает написать один тип который будет вмещать в себя другие параметры?

C#
1
2
3
4
5
6
7
8
9
10
11
            foo f = new foo();
            f.x = 10;
            f.y = 5;
 
            this.Invoke(new Action<foo>((obj) => MessageBox.Show((obj.x + obj.y).ToString())), f);
 
        class foo
        {
            public int x;
            public int y;
        }
Добавлено через 10 минут
А в третьих у меня прекрасно работает Action<T1, T2>.

C#
1
2
3
            int x = 5;
            int y = 10;
            this.Invoke(new Action<int, int>((xParam, yParam) => MessageBox.Show((xParam + yParam).ToString())), x, y);
В третьих у меня почему-то не работает, как я уже писал, ему в принципе не нравится конструкция Action<int, int>, возможно это так же связанно с версией .net, но я сделал как во-вторых:
C#
1
grid.Invoke(new Action<foo>((s) => grid.Columns.Add(s.x, s.y), gridParam));
Теперь пишет: Method name expected
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
01.08.2013, 14:16
А какая религия вам запрещает использовать .NET 3.5, 4, 4.5, 5?
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
01.08.2013, 14:21  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
А какая религия вам запрещает использовать .NET 3.5, 4, 4.5, 5?
Эта религия называется клиент.
0
 Аватар для Anklav
447 / 305 / 47
Регистрация: 23.01.2013
Сообщений: 661
01.08.2013, 14:24
Не там скобку поставили.

C#
1
grid.Invoke(new Action<foo>((s) => grid.Columns.Add(s.x, s.y)), gridParam);
1
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
01.08.2013, 15:22  [ТС]
Цитата Сообщение от Anklav Посмотреть сообщение
Не там скобку поставили.

C#
1
grid.Invoke(new Action<foo>((s) => grid.Columns.Add(s.x, s.y)), gridParam);
Знал, что уже совсем мелочь осталась
Спасибо большое!!!
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
01.08.2013, 16:09
а кто мешает сделать приложение OnceClick с проверкой допустимой версии .NET?
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
01.08.2013, 16:32  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
а кто мешает сделать приложение OnceClick с проверкой допустимой версии .NET?
И что делать если версия не допустима?
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
01.08.2013, 17:22
ну вы как маленький, не знаете прописных истин про версии ОС Windows и версии .NET устанавливаемые по умолчанию, WinXP SP3 - 1.1 (2.0 - 3.5 через обновления, 4.0 отдельным установщиком, 4.5 не поддерживается), Windows Vista 3.0 минимум, Windows 7- 3.5, Windows 8 4.5. На крайний случай пусть ставят допустимую версию с сайта через который будет распространятся "ClickOnce" - приложение, ссылка на допустимую версию .NET там всегда присутствует по умолчанию
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
01.08.2013, 17:32  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
ну вы как маленький, не знаете прописных истин про версии ОС Windows и версии .NET устанавливаемые по умолчанию, WinXP SP3 - 1.1 (2.0 - 3.5 через обновления, 4.0 отдельным установщиком, 4.5 не поддерживается), Windows Vista 3.0 минимум, Windows 7- 3.5, Windows 8 4.5. На крайний случай пусть ставят допустимую версию с сайта через который будет распространятся "ClickOnce" - приложение, ссылка на допустимую версию .NET там всегда присутствует по умолчанию
Я уже слишком старенький для таких истин. Вопрос был риторическим ибо на машинах, на которых будет работать данное ПО стоит XP SP3 с .net 2.0, на многих из них нет интернета и почти на всех из них нет админских прав, которые ну абсолютно необходимы для обновления .net.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
01.08.2013, 18:11
кхм... если вы старенький то вы должны знать что существует прекрасная альтернатива C# как то абсолютно кросплотформенный С++ и boost + Qt в качестве альтернативы, ну а если кроме как на C# писать не хотите используйте только ту версию .NET которая может быть доступна клиентам, (виртуализацию приложений я тут не рассматриваю), и не жалуйтесь на осутствие каких либо возможностей связаных с отсутствием у клиентов необходимого инструментария, и будет вам счастье

P. S. В конце концов Вам никто не мешает написать простейший инсталятор который будет проверять наличие необходимой версии .NET и при ее отсутствии просто ставить его в "тихом режиме" из файла инсталятора .NET который будет лежать рядом

P. P. S. Все прокламации связные с тем что клиенту нельзя поставить необходимое ПО для успешной работы программы есть бред т. к. по умолчанию при установке любого ПО можно затребовать администраторский доступ на время установки
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
01.08.2013, 20:47  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
кхм... если вы старенький то вы должны знать что существует прекрасная альтернатива C# как то абсолютно кросплотформенный С++ и boost + Qt в качестве альтернативы, ну а если кроме как на C# писать не хотите используйте только ту версию .NET которая может быть доступна клиентам, (виртуализацию приложений я тут не рассматриваю), и не жалуйтесь на осутствие каких либо возможностей связаных с отсутствием у клиентов необходимого инструментария, и будет вам счастье

P. S. В конце концов Вам никто не мешает написать простейший инсталятор который будет проверять наличие необходимой версии .NET и при ее отсутствии просто ставить его в "тихом режиме" из файла инсталятора .NET который будет лежать рядом

P. P. S. Все прокламации связные с тем что клиенту нельзя поставить необходимое ПО для успешной работы программы есть бред т. к. по умолчанию при установке любого ПО можно затребовать администраторский доступ на время установки
Не настолько старенький, не воспринимайте всё слишком серьёзно. Плюсы отличная альтернатива и я пожалуй совершил ошибку на этапе проектирования сделав выбор в пользу шарпа, но ни сколько об этом не жалею и уж тем более не жалуюсь на ограничения второго фреймворка, всего лишь ищу решения в его рамках. Просто сейчас не время переписывать всё под плюсы, а уж тем более под кьют. Я просто дописываю приложение на шарпе и использую ту версию фреймворка, которая доступна клиентам.
А насчёт запросов админского доступа и всего такого, называйте это рекламацией или чем угодно другим, но Вы видимо никогда не работали за казённой машинкой на которой Вам, простите, пукнуть нельзя без разрешения, а получить это разрешение - квест длиной в пару месяцев, с непредсказуемым результатом и периодическими доказательствами того, что Ваша персона не имеет ничего общего с, без сомнения достойнейшим из животных, кораблём пустыни - верблюдом.
0
 Аватар для агерон
447 / 300 / 65
Регистрация: 12.10.2009
Сообщений: 1,162
01.08.2013, 21:08
Ой да ладно тут на жизнь жаловаться.... 2-3 баклахи пива админам и можно подойди адекватно к вопросу, вопрос решают люди а не бумажки,в данном случае админы сети, а всякие запросы и отчеты в основном нужны что бы прикрыть то что уже сделано, и вообще что это за разработчик который не имеет полного локального доступа к своей рабочей машине?
0
29 / 24 / 8
Регистрация: 25.10.2009
Сообщений: 265
01.08.2013, 21:31  [ТС]
Цитата Сообщение от агерон Посмотреть сообщение
Ой да ладно тут на жизнь жаловаться.... 2-3 баклахи пива админам и можно подойди адекватно к вопросу, вопрос решают люди а не бумажки,в данном случае админы сети, а всякие запросы и отчеты в основном нужны что бы прикрыть то что уже сделано, и вообще что это за разработчик который не имеет полного локального доступа к своей рабочей машине?
Ну речь то не о моей локальной машине, речь о машине пользователя. Или Вы предлагаете к программе для каждого пользователя прикладывать 2-3 баклахи пива для админов?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.08.2013, 21:31
Помогаю со студенческими работами здесь

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

Вызов метода из dll
Здравствуйте. Имеется dll, в котором определен класс Class1 и метод Method1. Нужно вызвать Method1 с использованием Assembly...

Вызов метода в цикле While
Всем привет! Есть два метода: один шифрует пароль (получает строку - выводит зашифрованую строку) и есть метод разшифровки (получает...

Вызов нестатического метода
Нужно найти среднее арифметическое элементов массива с вызовом нестатического метода double Average у меня выходит так, но есть ошибка,не...

Наследование и вызов метода
есть базовый класс и класс потомок. class a { protected int a; protected int b; public a() { a=0; b = 0; }


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
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, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
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 Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru