Почему не-пользовательский поток может изменять управление пользовательским интерфейсом в WinForm & TPL? - PullRequest
2 голосов
/ 23 сентября 2011

Я тестировал кусок кода TPL, который я написал ниже. Два ManagedThreadId отображают разные числа. Поэтому я предполагаю, что новая задача выполняется в потоке без пользовательского интерфейса.

Мой вопрос: как задача может отображать сообщение и изменять элемент управления пользовательского интерфейса? Я что-то упустил. Я подумал, что мне нужно получить ссылку на SynchronizationContext интерфейса пользователя и использовать его для внесения изменений в интерфейс других потоков.

//var uiScheduler = TaskScheduler.FromCurrentSynchronizationContext();
MessageBox.Show(Thread.CurrentThread.ManagedThreadId.ToString());

Task testTask = new Task(() => {
        MessageBox.Show(
            Thread.CurrentThread.ManagedThreadId.ToString());
        lblTest.Text = "Test";
    });
testTask.Start();

Дополнительно:

Скачать VS решение здесь

Дополнение 2

Может ли кто-нибудь протестировать решение и указать, получит ли он исключение или нет?

1 Ответ

3 голосов
/ 23 сентября 2011

Это не будет работать , если не используется свойство Control.CheckForIllegalCrossThreadCalls , чтобы указать среде выполнения не проверять, соответствует ли вызывающий поток потоку, в котором создан элемент управления. *

Ваш тестовый код не работает для меня в новом проекте WinForms (InvalidOperationException: Межпотоковая операция недопустима: доступ к элементу управления 'lblTest' осуществляется из потока, отличного от потока, в котором он был создан). Возможно ли, что CheckForIllegalCrossThreadCalls (false) применяется в вашей среде?

Getting exception with your source code

...