private void button1_Click(object sender, EventArgs e)
{
Thread td = new Thread(threadRun);
td.Start();
**MessageBox.Show("abc");** //This is the key
Thread.Sleep(8000);
}
private void ChangeText()
{
MessageBox.Show("changeText");
}
private void threadRun()
{
MethodInvoker In = new MethodInvoker(ChangeText);
this.Invoke(In);
}
то, что происходит в этом коде:
changeText messageBox show up,
abc messageBox show up,
пользовательский интерфейс зависает на 8 секунд
НО, если я удаляю abc MessageBox, поведение будет следующим:
интерфейс пользователя зависнет на 8 секунд
changeText messageBox покажется
В режиме отладки VS, я могу четко отметить, что abc выполняется до changeText, но последовательность pop противоположна.
Если abcMessageBox изменяется на new Form (). ShowDialog () он действует так жепуть.очевидно, модальное диалоговое окно меняет последовательность, но, ПОЧЕМУ?
До этого эксперимента я думал, что Invoke означает, что мы помещаем упакованный делегат во внутреннюю очередь потока пользовательского интерфейса, а поток пользовательского интерфейса выполнит делегат после button1_click.Закончено, что также просто исключено из внутренней очереди, что делает его потокобезопасным.Это, кажется, имеет смысл, если abc не существует.
что происходит внутри?согласно исходному коду Messagebox, он просто вызывает win32API из потока, а не отправляет какое-либо сообщение или упаковывает делегата.
Извините, мои программы для Windows не получены, и спасибо за вашу помощь