vinodh muthusamy Ответов: 1

Как сделать поток живым в интерфейсе и спящем фоне


Я пытаюсь добавлять новый элемент в список каждые 5 секунд, но я получаю весь вывод в течение 1 секунды.

private void button_PrintNumber_Click(object sender, EventArgs e)
     {


         for (int i = 1; i <= 10; i++)
         {
           Thread backGroundThread = new Thread(DoTime); //here it does not wait for 5 sec?
             backGroundThread.Start();
             listBox1.Items.Add(i);

         }
     }
     private void DoTime()
     {

         Thread.Sleep(1000);
     }


Что я уже пробовал:

private void button_PrintNumber_Click(object sender, EventArgs e)
     {


         for (int i = 1; i <= 10; i++)
         {
           Thread backGroundThread = new Thread(DoTime); //here it does not wait for 5 sec?
             backGroundThread.Start();
             listBox1.Items.Add(i);

         }
     }
     private void DoTime()
     {

         Thread.Sleep(1000);
     }

1 Ответов

Рейтинг:
8

Bernhard Hiller

Прежде всего, значение, придаваемое потоку.Сон происходит в миллисекундах, а не в порциях по 5 миллисекунд: другой поток спит 1 секунду.
Но вы делаете это в другом потоке, и, следовательно, на основной поток это не влияет. Вы должны сделать этот цикл в другом потоке - а затем вы должны вызвать Invoke в списке, потому что элементы пользовательского интерфейса не должны быть доступны из другого потока.
Попробуйте что-нибудь вроде:

private void button_PrintNumber_Click(object sender, EventArgs e)
{
    Thread backGroundThread = new Thread(DoTime); 
    backGroundThread.Start();
}

private void DoTime()
{
     for (int i = 1; i <= 10; i++)
     {
          Thread.Sleep(5000);
          listBox1.Invoke(new Action(() => listBox1.Items.Add(i)));
     }
}


BillWoodruff

+5