Как выполнить код построчно? - PullRequest
0 голосов
/ 12 августа 2010

Возьмем этот пример кода

private void test()
{
    Label1.Text = "Function 1 started.";
    function1(); //This function takes a while to execute say 15 seconds.
    Label2.Text = "Function 1 finished.";
}

Если это запустить, вы никогда не увидите запущенную функцию 1.Поэтому мой вопрос: есть ли какие-нибудь функции c #, которые можно было бы вызвать, чтобы показать изменение метки.Примерно так

private void test()
{
    Label1.Text = "Function 1 started.";
    this.DoProcess();       //Or something like this.
    function1();             
    Label2.Text = "Function 1 finished.";
}

Я знаю, что это можно сделать с помощью потоков, но мне было интересно, есть ли другой способ.

Спасибо в adv.

Ответы [ 6 ]

6 голосов
/ 12 августа 2010

Application.DoEvents()

4 голосов
/ 12 августа 2010

, если это приложение WinForms, Label1.Update(). Если этого недостаточно:

Label1.Update()
Application.DoEvents()

Обычно вам нужны оба.

3 голосов
/ 12 августа 2010
var context = TaskScheduler.FromCurrentSynchronizationContext(); // for UI thread marshalling
Label1.Text = "Function 1 started.";
Task.Factory.StartNew(() =>
{
     function1();           
}).ContinueWith(_=>Label2.Text = "Function 1 finished.", context);

.NET 4 параллельная библиотека задач

3 голосов
/ 12 августа 2010

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

1 голос
/ 12 августа 2010

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

0 голосов
/ 12 августа 2010

Где private void test() называется?

Если нет в потоке пользовательского интерфейса, то вам может понадобиться delegate:

public delegate void UpdateLabelStatus(string status);

...

private void test()
{

     Invoke(new UpdateLabelStatus(LabelStatus1), status);
     ...

}

private void LabelStatus1(string status)
{

     Label1.Text = status;
}

В противном случае вы сможете выполнить Label1.Update();, а затем Application.DoEvents();

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