С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
3 / 3 / 0
Регистрация: 04.10.2019
Сообщений: 54

Подскажите как правильно использовать Invoke

15.03.2020, 18:44. Показов 1342. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Немогу понять почему не работает такая конструкция
C#
1
2
3
4
5
6
7
8
 if (InvokeRequired)
{
Invoke(new Action(() => label1.Text = "service not installed"));
}
else
{
label1.Text = "service not installed";
}
если вызывать из родного потока понятно что работает,из стороннего не работает
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.03.2020, 18:44
Ответы с готовыми решениями:

Как правильно использовать стек, использовать вершину стека и т.п
Научите пожалуйста правильно использовать стек, использовать вершину стека и т.п. Просто стек очень нужен - очень полезный оператор.

Как правильно использовать в других языках FileWrite из WinAPI подскажите
С++ я не знаю, в другом языке программирования нужно использовать FileWrite, но не получается (на этом форуме раздела этого языка нет, узко...

Как использовать Parallel::Invoke?
Помогите разобратся, никак не могу понять какие аргументы принимает Parallel::Invoke(gcnew Action<int>(parallelBody)); void...

11
Эксперт .NET
 Аватар для Rius
13072 / 7633 / 1669
Регистрация: 25.05.2015
Сообщений: 23,214
Записей в блоге: 14
15.03.2020, 20:23
Если InvokeRequired == true для того котнрола, у которого проверяется этот флаг, то будет вызван Invoke.
Это передаст указанный делегат в очередь сообщений окна. Когда очередь до него наконец дойдёт, он будет выполнен. Выполнен в том же потоке, в котором работает окно, т.е. без конфликтов связанных с межпоточным обращением.

Цитата Сообщение от yoos Посмотреть сообщение
из стороннего не работает
У "не работает" есть какие-то конкретные признаки?
0
3 / 3 / 0
Регистрация: 04.10.2019
Сообщений: 54
15.03.2020, 22:35  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
У "не работает" есть какие-то конкретные признаки?
текст не обновляется
0
Эксперт .NET
 Аватар для Rius
13072 / 7633 / 1669
Регистрация: 25.05.2015
Сообщений: 23,214
Записей в блоге: 14
15.03.2020, 22:36
А у всех других обновляется.
Значит, вы что-то не то делаете.
Покажите код.
0
3 / 3 / 0
Регистрация: 04.10.2019
Сообщений: 54
15.03.2020, 22:45  [ТС]
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
private void UpdateServiceState()
        {
            switch (msvc.GetServiceState())
            {
                case GUIDERSERV_STATE.NotInstalled:
                    {
                        if (this.label1.InvokeRequired)
                        {
                            this.label1.Invoke(new Action(() => this.label1.Text = "service installed"));
                        }
                        else
                        {
                            label1.Text = "service installed";
                        }
                    }
                    break;
                case GUIDERSERV_STATE.Stopped:
                    {
                        if (this.label1.InvokeRequired)
                        {
                            this.label1.Invoke(new Action(() => this.label1.Text = "service not running"));
                        }
                        else
                        {
                            label1.Text = "service not running";
                        }
                    }
                    break;
                case GUIDERSERV_STATE.Run:
                    { 
                        if (this.label1.InvokeRequired)
                        {
                            this.label1.Invoke(new Action(() => this.label1.Text = "service running"));
                        }
                        else
                        {
                            label1.Text = "service running";
                        }
                    }
                    break;
                default:
                    //label1.Text = "";
                    break;
            }
        }
 private void Updater()
        {
            while(needUpdUI)
            {
                if (needUpdUI)
                {
                    UpdateServiceState();
                }
                Thread.Sleep(500);
            }
        }
public Form1()
        {
            InitializeComponent();
            ReadSettings();
            UpdateServiceState();
            try
            {
                new Thread(new ThreadStart(Updater)).Start();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message + ex.InnerException, "Err", MessageBoxButtons.OK);
            }
        }
0
Эксперт .NET
 Аватар для Rius
13072 / 7633 / 1669
Регистрация: 25.05.2015
Сообщений: 23,214
Записей в блоге: 14
15.03.2020, 22:54
  1. try - catch надо разместить в коде потока;
  2. invoke и invokerequired лучше запрашивать у формы;
  3. Вы уверены, что до case дело вообще доходит? Отладчиком смотрели?
0
3 / 3 / 0
Регистрация: 04.10.2019
Сообщений: 54
15.03.2020, 23:15  [ТС]
Цитата Сообщение от Rius Посмотреть сообщение
Вы уверены, что до case дело вообще доходит? Отладчиком смотрели?
мессаджбокс из той секции кода срабатывает
Цитата Сообщение от Rius Посмотреть сообщение
invoke и invokerequired лучше запрашивать у формы;
пробовал, результат тот же
0
Эксперт .NET
 Аватар для Rius
13072 / 7633 / 1669
Регистрация: 25.05.2015
Сообщений: 23,214
Записей в блоге: 14
16.03.2020, 09:20
Я не вижу в этом блоке messagebox.

Запускайте поток не из конструктора формы, а из события Load.
0
3 / 3 / 0
Регистрация: 04.10.2019
Сообщений: 54
16.03.2020, 09:30  [ТС]
Проблема была в другом месте, просто информация не обновлялась,а не сам контролл. Теперь другой вопрос - как синхронизировать завершение потоков,что бы не ловить рандомные System.ComponentModel.InvalidAsynchronou sStateException ?
0
Эксперт .NET
 Аватар для Rius
13072 / 7633 / 1669
Регистрация: 25.05.2015
Сообщений: 23,214
Записей в блоге: 14
16.03.2020, 09:42
Ну я же спрашивал - код доходит до нужной строки? Вы сказали да, а теперь, оказывается, нет.............
Поток из конструктора всё равно запускать нельзя.

У вас один поток всего. С чем его синхронизировать?

Добавлено через 4 минуты
Может, вопрос в том, как завершить поток при закрытии формы?
0
3 / 3 / 0
Регистрация: 04.10.2019
Сообщений: 54
16.03.2020, 11:45  [ТС]
Доходит.Просто значения в switch не так менялось как я ожидал.
А сам процесс разве не поток?У приложения неможет быть одного потока,иначе как код будет выполнятся? Мне нужно как то синхронизировать правильно завершение обоих потоков,что бы дочерний гарантированно завершался, до закрытия формы.
0
Эксперт .NET
 Аватар для Rius
13072 / 7633 / 1669
Регистрация: 25.05.2015
Сообщений: 23,214
Записей в блоге: 14
16.03.2020, 11:53
В closing событии формы выставить флаг. И ждать завершения потока через join().
Флаг проверять в цикле потока. Как установится - выходить из цикла.

Вместо invoke попробуйте IProgress<T>
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.03.2020, 11:53
Помогаю со студенческими работами здесь

интересует метод Undo и свойство CanUndo, подскажите как правильно их использовать. На примере TDBEdit
Доброго времени суток. Ребят интересует метод Undo и свойство CanUndo, подскажите как правильно их использовать. На примере TDBEdit

Как правильно вызывать Method.invoke() ?
Есть вот такой код val ItemWandCasting=Class.forName(&quot;thaumcraft.common.items.wands.ItemWandCasting&quot;)//получаем класс, который не можем...

Как правильно передать указатель на структуру, и правильно ее использовать
Я планирую сделать сортировку, но компилятор начал ругаться &quot;Нет существует подходящей функции преобразования &quot;Student&quot; в...

В чем разница между Invoke Action и Invoke delegate (код внутри)
Добрый день! Не могли бы подсказать, в чем принципиальная разница? this.Invoke(new Action(() =&gt; { this.Text =...

Dispatcher.Invoke и delegate invoke, исправить ошибки в коде
привет не пойму почему второй код не работает? void bw_DoWork(object sender, DoWorkEventArgs e) { NextDel nd =...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru