Этикетка не меняется в реальном времени - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть цикл, который меняет label8. И я хочу, чтобы мои label8 менялись в реальном времени, но я получаю только последнее значение. Как я могу это сделать? Нужны ли параллельные потоки?

Это код, который меняет метку:

private void Form1_Shown(object sender, EventArgs e)
{
    decimal C = 35;
    label8.Text = ":";

    while (true)
    {
        C -= Convert.ToDecimal(0.01);
        label8.Text = Convert.ToString(C);
        System.Threading.Thread.Sleep(200);

    }
}

1 Ответ

0 голосов
/ 03 ноября 2018

Это связано с тем, что WinForm UI реализован с использованием цикла mssage, который обновляет контроллеры и запускается в специальном потоке "UI Thread" .

MessageLoop отвечает за вызов всех обратных вызовов событий, на которые вы зарегистрированы. На эту тему есть отличный пост Stephan Toub Жду, и пользовательский интерфейс, и тупики! Боже мой!

В вашем случае цикл сообщений о событиях называется Form1_Shown и запускается с использованием потока пользовательского интерфейса. В середине выполнения вы приказали текущему потоку (который является потоком пользовательского интерфейса и ответственным за обновление) перейти в спящий режим. и затем вы возобновляете его работу с большим количеством работы, пока ваш цикл не закончится.
Вы никогда не освобождали поток пользовательского интерфейса для выполнения какой-либо другой работы, кроме вашей. (Какие из этих работ получают уведомления о Label.Text, который вы хотели обновить)

Укладывать темы в спящий режим - в подавляющем большинстве плохой замысел или непонимание.

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

Возможно, вы хотели что-то подобное

private async void Form1_Shown(object sender, EventArgs e) // Notice the 'async'
{
    decimal C = 35;

    label8.Text = ":";
    while (true)
    {
        C -= Convert.ToDecimal(0.01);
        label8.Text = Convert.ToString(C);
        await Task.Delay(200); // Notice the 'await'
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...