Почему ярлык обновления приложения Win Forms не сразу? - PullRequest
0 голосов
/ 22 мая 2010

Я экспериментирую с потоками и создал метод 'control' для сравнения с тем, где вся обработка происходит в потоке пользовательского интерфейса. Следует запустить метод, который обновит метку в конце. Этот метод выполняется четыре раза, но метки не обновляются, пока все 4 не будут завершены. Я ожидал, что один ярлык будет обновляться примерно каждые 2 секунды. Вот код:

private void button1_Click(object sender, EventArgs e)
{
    Stopwatch watch = new Stopwatch();
    watch.Start();

    UIThreadMethod(lblOne);
    UIThreadMethod(lblTwo);
    UIThreadMethod(lblThree);
    UIThreadMethod(lblFour);

    watch.Stop();
    lblTotal.Text = "Total Time (ms): " + watch.ElapsedMilliseconds.ToString();
}

private void UIThreadMethod(Label label)
{
    Stopwatch watch = new Stopwatch();
    watch.Start();

    for (int i = 0; i < 10; i++)
    {
        Thread.Sleep(200);
    }
    watch.Stop();

    // this doesn't set text right away 
    label.Text = "Done, Time taken (ms): " + watch.ElapsedMilliseconds;
}

Может быть, я просто упускаю что-то простое, но я застрял. Есть идеи? Спасибо.

Ответы [ 2 ]

5 голосов
/ 22 мая 2010

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

Мне всегда приходится экспериментировать, когда я делаю подобные вещи, но метод Control.Refresh должен это сделать:

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.refresh.aspx

2 голосов
/ 22 мая 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...