Различное поведение InvalidOperationException между отладкой и временем выполнения - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть следующий код в приложении WinForm с одной кнопкой и одной меткой:

private void button1_Click(object sender, EventArgs e)
{
    Task.Run(() => label1.Text = Thread.CurrentThread.ManagedThreadId.ToString());
}

Когда я запускаю программу с помощью отладчика VS, label1.Text = ... выдаст System.InvalidOperationException из-за доступа к управлению в рабочем потоке. Это не проблема.

Но если я запускаю exe-файл напрямую, я вижу, что идентификатор рабочего потока будет отображаться на метке, а не исключение.

Чем вызвана эта разница?

обновление: если я запускаю его в VS с режимом выпуска, то нет ни исключения, ни идентификатора потока. Так что вот третий результат.

1 Ответ

2 голосов
/ 13 февраля 2020

Просто: в режиме релиза вам не удастся так же надежно обнаружить ваш взломанный код. Но: код все равно так же сломан в любом случае. Вы должны не пытаться дотронуться до элементов управления пользовательского интерфейса из рабочих потоков, поэтому: не делайте этого! Вы уверены, что не отключили Control.CheckForIllegalCrossThreadCalls где-нибудь? (примечание: вы не должны отключить его; я просто спрашиваю, возможно, у вас есть )

...