Совместное использование объектов между BackgroundWorker и основным потоком - PullRequest
5 голосов
/ 30 мая 2011

У меня есть объект ListBox в моем основном потоке (приложение WPF).Почему я не могу получить к нему доступ в потоке BackgroundWorker.Насколько я знаю, стек является отдельным для каждого потока, но куча является общей.Не является ли объект ListBox созданным в куче.В таком случае, почему это не доступно.Я попытался передать ссылку ListBox в качестве параметра и попытался получить доступ к его содержимому в BackgroundWorker.Отличается ли концепция совместного использования объектов между потоками от C ++?

1 Ответ

10 голосов
/ 30 мая 2011

Как и в WinForms, дизайн WPF значительно упрощен благодаря требованию доступа ко всем элементам пользовательского интерфейса только из потоков, которые их создали.

Когда вы пытаетесь написать многопоточную программу, эта «функция» может показаться серьезным ограничением. Невозможно изменить даже самые простые свойства элемента пользовательского интерфейса непосредственно из фонового потока. Если да, то как вообще использовать фоновые потоки с WPF?

Ответ заключается в том, что мы должны преобразовать наши действия, предназначенные для пользовательского интерфейса , в основной поток , где работа может выполняться без конфликтов. Строго говоря, наши действия должны выполняться в контексте потока, создавшего элемент, который мы пытаемся изменить.

Тема многопоточности в WPF довольно обширна, но вот отличная вводная статья:

Если вы прочитаете эту статью, вы увидите, как использовать Dispatcher для выполнения ваших действий без нарушения модели потоков.

...