C # MultiThreading в среде графического интерфейса - PullRequest
2 голосов
/ 23 марта 2012

почему, когда я запускаю программу, for не работает параллельно после «один» для это закончить «два» для начала заранее спасибо (я новичок в C #)

    private void button1_Click(object sender, EventArgs e)
    {

      Thread  t = new Thread(new ThreadStart(Threadtest));
      t.Start();

      for(int i = 0 ;i<5;i++)
         richTextBox1.Text = richTextBox1.Text + "one"+i+"\n";
    }
    private void Threadtest()
    {
        for (int i = 0; i < 5; i++)
        {
            MethodInvoker action = delegate { richTextBox1.Text = richTextBox1.Text + "two" + i + "\n"; };
            richTextBox1.Invoke(action);
        }

    }

Ответы [ 3 ]

3 голосов
/ 23 марта 2012

Вам нужно сделать это с более чем 5 итерациями. Нить даже не запускается до того, как ваш "один" материал завершен.

Кроме того, поскольку ваш «один» код никогда не спит, он может завершиться до того, как он позволит вашему маршалловому коду через Invoke вообще работать. Invoke / BeginInvoke заставляет код выполняться в потоке пользовательского интерфейса - это не может произойти, пока поток пользовательского интерфейса не будет выполнять никакой другой работы.

DoEvents включит это. Но это не то, что вы должны обычно использовать для многопоточности. Это просто помогает для этой иллюстрации многопоточности.

2 голосов
/ 23 марта 2012

РЕДАКТИРОВАТЬ 3: снова исправлено

Потоковый цикл не является «обновлением» обновлений, потому что ваш непоточный цикл не возвращает управление основному циклу событий графического интерфейса, который обрабатывает события из вашего потока.Таким образом, все это происходит потом.Одним из способов «увидеть» это могло бы быть создание двух потоков.

1 голос
/ 23 марта 2012

Среда графического интерфейса однопоточная.И с этим ничего не поделаешь. Так устроены графические интерфейсы в Windows.

Invoke ставит в очередь только те операции в потоке графического интерфейса, которые должны быть выполнены после текущей операции, button1_Click, готово.

Вы можете использовать Appllication.DoEvents для обработки чего-либо в очереди перед продолжением, но пользовательский интерфейс все еще однопоточный.

...