Совместное использование объектов между фоновым работником и основным потоком

#c# #wpf #backgroundworker

#c# #wpf #backgroundworker

Вопрос:

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

Комментарии:

1. не могли бы вы, пожалуйста, показать какой-нибудь фрагмент кода?

2. Вы можете передать его как любой другой объект, но как только вы измените его, будет вызвано исключение, поскольку потоковая модель STA . Вы можете найти, как безопасно изменить это из разных потоков на stackoverflow .

Ответ №1:

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

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

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

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

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