powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / передать контрол в backgroundWorker_ProgressChanged
5 сообщений из 5, страница 1 из 1
передать контрол в backgroundWorker_ProgressChanged
    #36880404
ndm25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени.

В обработчике backgroundWorker_DoWork создается объект. Есть необходимость его передать в backgroundWorker_ProgressChanged для добавления в FlowDocument, который находится в Element Host на WinForm. При передаче в обработчик backgroundWorker_ProgressChanged выбрасывается эксепшн "The calling thread cannot access this object because a different thread owns it."
Если создавать аналогичным образом например TextBox, то передается нормально...

Вот пример кода:

Paragraph p = new Paragraph();
p.FontSize = 18;
p.FontWeight = FontWeights.Bold;
p.Foreground = System.Windows.Media.Brushes.DarkGreen;
p.KeepTogether = false;
backgroundWorker.ReportProgress(1, p);

Подскажите в чем может быть дело ...
...
Рейтинг: 0 / 0
передать контрол в backgroundWorker_ProgressChanged
    #36880622
Bob Dylan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Using the Dispatcher to Access Controls on Another Thread

At times, you may want to change the user interface from a worker thread. For example, you may want to enable or disable buttons, or show a modal ProgressBar that provides more detailed progress information than is allowed by the ReportProgress method. The WPF threading model provides the Dispatcher class for cross thread calls. By using the Dispatcher, you can safely update your user interface from background worker threads.

You can get a reference to the Dispacther object for a UI element from its Dispatcher property.


System.Windows.Threading.Dispatcher aDisp = Button1.Dispatcher;Dispatcher provides two main methods that you will use; Invoke and BeginInvoke. Both methods allows you to call a method safely on the UI thread. The BeginInvoke method allows you to call a method asynchronously, and the Invoke method allows you to call a method synchronously.



From :
http://elegantcode.com/2009/07/03/wpf-multithreading-using-the-backgroundworker-and-reporting-the-progress-to-the-ui
...
Рейтинг: 0 / 0
передать контрол в backgroundWorker_ProgressChanged
    #36880677
ndm25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bob Dylan,

Да, все верно. Но, в этом случае теряется смысл в фоновом потоке. Т.к. в нем я собирался генерить объекты, а в MainThread добавлять уже в WorkingDocument.
...
Рейтинг: 0 / 0
передать контрол в backgroundWorker_ProgressChanged
    #36883059
Bob Dylan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ndm25,

своими ручками тогда нужно синхронизацию делать, можно, наверное где-нибудь что-то похожее
найти и подточить паяльником :)

http://www.codeproject.com/KB/cpp/SyncContextTutorial.aspx

http://www.idesign.net/idesign/DesktopDefault.aspx?tabindex=5&tabid=11
...
Рейтинг: 0 / 0
передать контрол в backgroundWorker_ProgressChanged
    #36884139
ndm25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bob Dylan,

Большое спасибо, почитаю ...
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / передать контрол в backgroundWorker_ProgressChanged
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]