Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
1 / 1 / 0
Регистрация: 16.02.2024
Сообщений: 8

Динамический вывод значения переменной

16.07.2025, 13:22. Показов 3112. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Есть форма, на ней строка состояния с меткой.
Как сделать, чтобы в статусе динамически отображалось переменная?
Вот код.
Прогресс меняется, а метка всегда = 0 в цикле.
C#
1
2
3
4
5
6
7
8
9
10
private void button8_Click(object sender, EventArgs e)
{
    toolStripProgressBar1.Maximum = 1000;
    for (int i = 0; i < 1000; i++)
    {
        toolStripStatusLabelFiles.Text=i.ToString();
        toolStripProgressBar1.Value = i;
        Thread.Sleep(100);
    }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.07.2025, 13:22
Ответы с готовыми решениями:

Надо вывести название переменной, тип данных переменной, значение переменной
у нас есть переменная int variable = 0; Надо вывести название переменной, тип данных переменной,...

Как присвоить значение переменной, исходя из значения другой переменной?
Всем привет. Нужна помощь. Есть переменная, например &quot;month&quot; которая может принимать значения...

Динамический вызов переменной или константы
Здравствуйте товарищи! :drink: У меня в проекте есть файл с константами задефайненные... ...

36
17.07.2025, 13:11
Студворк — интернет-сервис помощи студентам

Не по теме:

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
После await выполнение метода переходит в главный поток
Ещё раз внимательно глянь что я скинул в консольном примере. Там в конце чётко видно что даже запущенная в главном потоке задача перенаправляется на другой для продолжение работы. Для отдельно запущенных тасок это тоже работает и логично, ведь весь смысл в реюзе потоков из пула.

0
2296 / 1612 / 400
Регистрация: 26.06.2017
Сообщений: 4,774
Записей в блоге: 1
17.07.2025, 13:13
Могу ошибаться, но при изучении тасков где-то встречалось, что возврат в поток с await происходит благодаря SynchronizationContext.
1
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
17.07.2025, 14:04
Цитата Сообщение от Wolfdp Посмотреть сообщение
C#
1
async Task Nya()
Тут задача, и вот тут вы её ожидаете
Цитата Сообщение от Wolfdp Посмотреть сообщение
C#
1
await Nya();
Задача выполняется в другом потоке.

А вот тут вы ничего не ожидаете
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
private async void button1_Click(object sender, EventArgs e)
{
    async Task Noise()
    {
        while (f)
            await Task.Delay(100);
    }
 
    ids.Clear();
    var button = (Button)sender;
    button.Enabled = false;
    f = true;
    for (var i = 0; i < 10; i++)
        _ = Noise(); // А вот тут задача улетела в никуда
 
    for (var i = 0; i < 5; i++)
    {
        // В другом потоке
        await Task.Delay(1000); 
        // А это уже главный поток приложения
        ids.Add(Environment.CurrentManagedThreadId); 
    }
    f = false;
    button.Enabled = true;
    button.Text = string.Join(";", ids); // всегда будет 1;1;1;1;1;
}
Запустил и забыл, как синхронный метод, а окружение уже обрабатывается в основном потоке.
0
17.07.2025, 15:35

Не по теме:

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А вот тут вы ничего не ожидаете
В смысле "ничего не ожидаю"? А await по ваше что будет делать? Там даже кнопка разблокируется только после завершения цикла спустя 5 сек. Хз, может вас смутило отсутствие отдельного метода, но если вынести -- всё ровно также работает.

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
public partial class MainForm : Form
{
    private List<int> ids = new();
    private bool f = false;
 
    public MainForm()
    {
        InitializeComponent();
    }
 
    private async Task Noise()
    {
        while (f)
            await Task.Delay(100);
    }
 
    private async Task Nya()
    {
        for (var i = 0; i < 5; i++)
        {
            await Task.Delay(1000);
            ids.Add(Environment.CurrentManagedThreadId);
        }
    }
 
    private async void button1_Click(object sender, EventArgs e)
    {
        ids.Clear();
        var button = (Button)sender;
        button.Enabled = false;
        f = true;
        for (var i = 0; i < 10; i++)
            _ = Noise();
 
        await Nya();
        
        f = false;
        button.Enabled = true;
        button.Text = string.Join(";", ids); // также сплошные единицы
    }
}
Причём эта магия работает именно когда идет последовательный вызов без задействования фабрики (я ооооочень долго допирал до этого момента). Если вместо await Nya(); сделать await Task.Run(Nya); -- то всё выполнение улетает в различные потоки из пула, и при обращении к UI элементам получаешь по ушам тапком в рантайме.

Плюс отмечу что Delay не выполняется в отдельном потоке. Это прерывание выполнения, что ближе к различным внешним запросам ради которых обычно и влезают в асинхронность. Чекнуть это относительно легко
C#
1
2
3
4
5
6
for (var i = 0; i < 1_000; i++)
    _ = Task.Delay(TimeSpan.FromMinutes(10)); // долгий таймаут
 
await Task.Delay(TimeSpan.FromSeconds(10)); //задачи как правило стартуют не сразу
 
var count = ThreadPool.ThreadCount; //пул практически пустой, в диспетчере нагрузки на CPU нет

0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
17.07.2025, 15:51
Цитата Сообщение от Wolfdp Посмотреть сообщение
В смысле "ничего не ожидаю"?
Вот тут диспетчер UI вызывает обработчик как синхронный метод, так как он не умеет слушать Task, потому метод void. Просто вызвал его и забыл, и ему фиолетово что там внутри происходит.
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
C#
1
private async void button1_Click(object sender, EventArgs e)
Что бы задача запустилась в другом потоке, она должна быть задачей (Task), а не void, тогда await выделит ей поток и будет ждать выполнения. А если метод void, то задачи нет и всё что за/перед await в этом методе будет в потоке, который вызвал этот метод.

Добавлено через 2 минуты
Цитата Сообщение от Wolfdp Посмотреть сообщение
и при обращении к UI элементам получаешь по ушам тапком в рантайме
SynchronizationContext вам в помощь.
0
17.07.2025, 16:53

Не по теме:

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Что бы задача запустилась в другом потоке, она должна быть задачей (Task), а не void, тогда await выделит ей поток и будет ждать выполнения. А если метод void, то задачи нет и всё что за/перед await в этом методе будет в потоке, который вызвал этот метод.
Брррр.... void влияет ровно на одно -- вызывающая сторона не сможет дождаться завершения. И даже так мои примеры можно переписать с использованием void, чтобы получить ровно тоже самое:

- в консольном приложении вызов кода после await будет обрабатываться в случайном потоке из пула
- в UI приложении код будет продолжаться работать именно в UI потоке.
- вызов метода в обоих случаях идентичен.

Понятно что это все сделано намерено, понятны причины, понятно как с этим работать. Не совсем понимаю реализацию. Просто пометить поток как STA такого эффекта не даст. Т.е. что-то отличается прям в окружении, причём как я понимаю именно в самом коде обработки всяких OnClick в контролах.

0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
17.07.2025, 17:34
Цитата Сообщение от Wolfdp Посмотреть сообщение
void влияет ровно на одно -- вызывающая сторона не сможет дождаться завершения.
А она его и не ждёт, она просто запустила метод в никуда и всё, и ей фиолетово когда он выполнится и что будет с результатом.

Я про то что все обработчики событий в UI (WF, WPF) void. И для того чтобы запустить асинхронный метод внутри этого метода делают async void, но это, для вызывающего кода, в нашем случае UI, тоже самое как вызвать простой синхронный метод. Вот потому всё что в методе не await выполняется синхронно, в потоке UI. В документации MS пишут что все асинхронные методы должны возвращать Task, исключение составляют обработчики событий элементов UI. Вот такие пироги с котятами...

Хотите реальную асинхронную обработку нажатий кнопок в UI - используйте WPF и AsyncRelayCommand() из пакета CommunityToolkit. Там вам будет и Task, и потоки, и блокировка кнопки на время выполнения, и отмена выполнения команды, и все остальные прелести Task.

Добавлено через 4 минуты
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
используйте WPF
UWP и может быть WinUI, Avalonia...
0
17.07.2025, 17:56

Не по теме:

Andrey-MSK, если вы в консольном приложении добавите свой класс, который будет иметь event, сделаете на него подписку и вызовите в нём async метод, то он будет вести себя ровно также, как я говорил выше -- брать свободный поток и выполнять код после await в нём.

Я сейчас краем глаза глянул в нейронке что к чему и насколько понял Uswer сразу дал правильное указание -- различие в SynchronizationContext. Под капотом Form вызывается простановка WindowsFormsSynchronizationContext, который и будет пушить выполнение кода в нужный на Thread (шо логично, ведь без окна у нас нет очереди). Хотя один фиг выглядит как "черная магия". Когда-нибудь может таки дойдут лапки разобрать это всё нормально...

0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
18.07.2025, 08:38
Цитата Сообщение от Wolfdp Посмотреть сообщение
если вы в консольном приложении добавите свой класс
Про консольные разговора и не было
0
18.07.2025, 09:05

Не по теме:

Цитата Сообщение от Andrey-MSK Посмотреть сообщение
Про консольные разговора и не было
А, ну т.е. я до этого по десять раз написал что сравниваю консольный вариант и при работе с UI в пустоту? Ну ок.

0
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
18.07.2025, 09:15
Wolfdp, Я же в ответах говорил про UI и обработчики событий.
0
 Аватар для Kazbek17
1485 / 939 / 455
Регистрация: 06.02.2012
Сообщений: 2,870
23.07.2025, 01:24
Andrey-MSK,
Честно скажу, сколько лет с C# но с потоками я на Вы. Вроде все понятно, но в тоже время, сижу как баран на новые ворота смотрю. Может кто пояснит на пальцах как с ссссска с ними работать. Кто что читал интересное?
0
Эксперт .NET
 Аватар для Rius
13826 / 7869 / 1704
Регистрация: 25.05.2015
Сообщений: 23,900
Записей в блоге: 14
23.07.2025, 05:22
Kazbek17, Литература по C# для начинающих и не только , Шилдт, главы 22-23.
1
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
23.07.2025, 08:33
Kazbek17, Джозеф Албахари: C#12 (или более новый, структура книг одинаковая) Справочник. Главы 14, 15.
1
Эксперт .NET
 Аватар для Wolfdp
3790 / 1767 / 371
Регистрация: 15.06.2012
Сообщений: 6,543
Записей в блоге: 3
23.07.2025, 14:14
Kazbek17,
думаю нужна практика в решении многопользовательского или многозадачного кода. Без практики читать можно долго и бессмысленно.
1
 Аватар для Andrey-MSK
3392 / 2278 / 388
Регистрация: 14.08.2018
Сообщений: 7,703
Записей в блоге: 4
23.07.2025, 14:39
Kazbek17, Вообще вся эта бодяга с асинхронностью хорошо вписывается в UI, иногда даже кажется что это было специально для таких приложений и придумано. Попробуйте написать богатое приложение с базами данных, которое не будет замирать при чтении/записи в БД, или что-то будет долго считать, отображая прогресс чего-то там где-то там, и все эти async/await практически сразу поймёте
1
 Аватар для CiProger
2 / 2 / 0
Регистрация: 19.02.2019
Сообщений: 32
25.07.2025, 18:37
Это сложно, а представь у него будет 1 000 строк стояний которые будут меняться? И ему придется писать 1000 обработчиков событий? Мне думается лучше реализовать класс, который будет отслеживать и визуализировать процессы выполнения приложения. Можно набросать план на худой конец...

Объект который содержит метод, или группу методов полем + объекты интерфеса которые отображают состояние. Внутренности тут уже творческая состовляющая как захочется. Долго, сложно но расширяемо и бесперебойно.

Если это у него такая учебная задача то система обучения хромает, на кой черт взять вырезать из общей концепции ООП одну фишку и заставить её лепить из комна и палок. Если он сам пытается что-то написать, какой-то лаунчер или игрушку то такой костыль как у него сойдет =)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.07.2025, 18:37

Вывод значения локальной переменной в TextBox
Нашёл на форуме такой код: private static extern IntPtr GetDC(IntPtr hwnd); ...

Вывод имени переменной, а не ее значения
Добрый день. using System; using System.Collections.Generic; using System.Linq; using...

Вывод значения переменной, занимающей определенное количество символов, в консоли
Как вывести в консоли значения переменных, что бы они занимали одинаковое расстояние от начала...

Вывод на экран значения переменной j после окончания цикла
using System; class Cicly2 { static void Main() { for (int i = 0; i &lt; 10; i++) { ...

Вывод значения переменной за пределы функции
double x = double.Parse(textBox1.Text); double b = double.Parse(textBox2.Text); ...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru