Может ли BeginInvoke прерывать код, уже запущенный в потоке пользовательского интерфейса? - PullRequest
0 голосов
/ 12 января 2010

Предположим, у меня есть некоторый код, который выполняется в потоке пользовательского интерфейса, который порождает новый поток для работы в фоновом режиме, а затем продолжает работу с пользовательским интерфейсом. Когда фоновая работа завершена, 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 после нажатия?

1 Ответ

5 голосов
/ 12 января 2010

BeginInvoke добавляет делегата в очередь (точнее, в очередь сообщений). Таким образом, ответ - нет, они не будут прерваны. Ваш обработчик нажатия кнопки фактически выполнен из-за сообщения в очереди сообщений.

РЕДАКТИРОВАТЬ: Извините, я забыл ответить на ваш второй вопрос, но вы, вероятно, можете понять это самостоятельно. Текст кнопки будет длинным. MaxValue - 1. Возможно, вы захотите выполнить stopUIWork без использования BeginInvoke.

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