Предположим, у меня есть некоторый код, который выполняется в потоке пользовательского интерфейса, который порождает новый поток для работы в фоновом режиме, а затем продолжает работу с пользовательским интерфейсом. Когда фоновая работа завершена, BeginInvoke вызывается из нового потока. Если работа пользовательского интерфейса все еще продолжается, будет ли обратный вызов, переданный BeginInvoke, прерывать работу пользовательского интерфейса или он будет ждать?
Пример кода - добавьте кнопку с именем button1 в форму и добавьте button1_Click к событию click, а затем добавьте это в форму:
bool continueWork = true;
private void button1_Click(object sender, EventArgs e)
{
Thread workThread = new Thread(performBackgroundWork);
workThread.IsBackground = true;
workThread.SetApartmentState(ApartmentState.STA);
workThread.Start();
for (long i = 0; i < long.MaxValue; i++)
{
if (!continueWork)
break;
button1.Text = i.ToString();
}
}
private void performBackgroundWork()
{
Thread.Sleep(1);
button1.BeginInvoke(new MethodInvoker(stopUIWork));
}
private void stopUIWork()
{
continueWork = false;
}
Что такое текст button1 после нажатия?