1 | |
Как правильно работать с SynchronizationContext?15.03.2013, 11:52. Показов 15145. Ответов 20
Метки нет (Все метки)
Собственно искал толковые примеры, где было бы понятно для чего вообще нужен этот класс, но не нашёл ничего внятного. Может кто-то на примере объяснить, как оно работает и зачем нужно? Вроде бы BackgroundWorker его использует.
0
|
15.03.2013, 11:52 | |
Ответы с готовыми решениями:
20
Зачем нужен/как использовать SynchronizationContext.SetSynchronizationContext(.)? Как правильно работать с БД Как правильно работать с My.Settings? Как правильно работать с Recordset |
197 / 197 / 5
Регистрация: 24.07.2010
Сообщений: 1,311
|
|
15.03.2013, 12:00 | 2 |
собсно вбил в гугле название этого класса и вот сразу выпала статья http://habrahabr.ru/post/107583/
0
|
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
|
|
15.03.2013, 12:03 | 4 |
0
|
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
|
|
15.03.2013, 12:04 | 6 |
1
|
15.03.2013, 12:07 [ТС] | 7 | |||||
Чёт я не совсем врубаюсь в этот код. Вроде и понятно, когда точек останова наставишь, но всё же. Я чёт подзабыл, что там делает async, await и сейчас читать не охота про это. Но видимо придётся...
0
|
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
|
||||||
15.03.2013, 12:13 | 8 | |||||
Вот тут если почитать можно понять: http://www.codeproject.com/Art... ext-Part-I
Грубо говоря этот класс использовали как Dispatcher из WPF. Добавлено через 1 минуту вот тут: Кликните здесь для просмотра всего текста
Добавлено через 2 минуты Короче говоря создаёшь его в одном потоке и передаешь в другой. Ну и из второго потока можно выполнить код какбы в первом потоке. Добавлено через 1 минуту Ну а если зайти ещё дальше то таким образом можно создать один такой контекст и передать в кучу потоков. И они смогут через него закидывать расчитанные данные в основной поток.
1
|
15.03.2013, 12:19 [ТС] | 9 |
То есть, гурбо говоря, можно замутить свой BackroundWorker и при инициации события какого-то можно из другого потока передавать данные в основной так, что подписчику на мой BackroundWorker не придётся вызывать Invoke или обращаться к Dispatcher (WinForms, WPF), чтобы выполнить код в обработчике события класса BackroundWorker?
Добавлено через 5 минут Походу я замудрённо написал . Меня не поняли.
0
|
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
|
||||||||||||||||
15.03.2013, 12:24 | 10 | |||||||||||||||
Не! Я понял! Я коды вытаскиваю! Дабы проилюстрировать!
Весь BackgroundWorker Кликните здесь для просмотра всего текста
private AsyncOperation asyncOperation; Код AsyncOperation Кликните здесь для просмотра всего текста
Как можно видеть BackgroundWorker использует эту штуку для передачи прогресса выполнения в вызывающий поток!
1
|
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
|
|
15.03.2013, 12:43 | 12 |
его не только фоновый воркер использует, но и другие классы у которых есть асинхронные операции, webclient тот же
ну а так да - нужен для вброса в основной поток создается через AsyncOperationManager.CreateOperation(), потом собственно вызывается его post..
0
|
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
|
|
15.03.2013, 12:49 | 13 |
Ну почему ж!!!! Смотри!
BackgroundWorker доржит в себе обёртку над SynchronizationContext. Запускает расчёты в паралельном потоке. Паралельный поток считает и при этом сообщает сколько он уже просчитал. А BackgroundWorker через обёртку дёргает свои эвенты. Получается паралельный поток сообщает свой прогресс и если эти данные передать сразу, то в твоём коде вылетит ошибка. Поэтому this.asyncOperation.Post(this.progressReporter, (object) changedEventArgs); переводит эти данные в основной поток.
0
|
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
|
|
15.03.2013, 12:53 | 14 |
во нашел руководство по использованию всей этой асинхронной радости http://msdn.microsoft.com/ru-r... 3kx67.aspx
возня страшная, но зато потом очень прикольно пользоваться )
0
|
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
|
|
15.03.2013, 13:15 | 15 |
Перечитав всё это вслух можно вызвать дьявола!!!! Это описание путает мне мозг окончательно!
1
|
25.03.2013, 19:38 [ТС] | 16 | ||||||||||
Почему на консоль не выводится сообщение? Что не правильно?
Хм... А вот на форме всё работает:
0
|
1453 / 845 / 150
Регистрация: 06.06.2012
Сообщений: 2,370
|
|
26.03.2013, 11:17 | 17 |
Думаю просто нужно создать новый экземпляр и передать его в паралельный поток! Ведь он будет выполнять код в том потоке в котором он был создан!
0
|
26.03.2013, 12:30 [ТС] | 19 |
Собственно в первом примере я так и сделал. Всё так же не работает.
В смысле не заморачиваться такими вопросами или что? Я понял что речь о Task Parallel Library.
0
|
Master of Orion
|
|
26.03.2013, 12:38 | 20 |
Casper-SC, да, не заморачиваться, и пользоваться стандартными классами типа parallel, запросов AsParallel() и так далее
0
|
26.03.2013, 12:38 | |
26.03.2013, 12:38 | |
Помогаю со студенческими работами здесь
20
Как правильно работать с JSON? Как правильно работать с RadioButton Как правильно работать с парсером? Как правильно работать с vector? Как правильно работать с NRF24L01? Как правильно работать с потоками? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |