|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
Могут ли возникнуть ошибки одновременного доступа к объекту в следующем коде? Код выполняется в Silverlight. Есть некий сервис, запрашивающий данные: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
И есть код: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Здесь происходит несколько одновременных запросов, по завершении которых происходит вызов DoSmthElse(); Достигается это за счет использования переменной asyncCounter. Будут ли проблемы при использовании этой одной переменной в обработчиках разных запросов в Silverlight? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2012, 11:56 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
enigmatic, предлагаешь всем подебажить твои отрывки кода в своих головах? тогда тебе в тему "Экстрасенсы говорят". ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2012, 12:12 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
enigmaticБудут ли проблемы при использовании этой одной переменной в обработчиках разных запросов в Silverlight?Да. зы: Если DownloadStringCompleted выполняется в гуйном потоке - тогда нет. Надо смотреть мануал по этому событию. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2012, 12:38 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
зы: Зря ты не послушал совета, и не стал использовать Task-и. Вместо этой байды применил бы Task.ContinueWhenAll . Дело твоё конечно, просто мысль... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2012, 12:41 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
Алексей КenigmaticБудут ли проблемы при использовании этой одной переменной в обработчиках разных запросов в Silverlight?Да. зы: Если DownloadStringCompleted выполняется в гуйном потоке - тогда нет. Надо смотреть мануал по этому событию. Хорошо. Значит, можно (пока) не беспокоиться. http://msdn.microsoft.com/en-us/library/cc197953(v=vs.95).aspx The WebClient callback, which is raised when the HTTP response is returned, is invoked on the User Interface (UI) thread, and can be used to update the properties of UI elements. Алексей Кзы: Зря ты не послушал совета, и не стал использовать Task-и. Вместо этой байды применил бы Task.ContinueWhenAll . Дело твоё конечно, просто мысль...Пока просто не могу этого сделать, т.к. пока не умею с тасками и пока в приоритете работа вообще не связанная с этим топиком. Целью этого вопроса было убедиться, что вышеописанное не таит в себе скрытых граблей, на которые можно нарваться по неопытности. В перспективе, нужно будет реализовать то же самое на Task (или Rx). AlexeiKпредлагаешь всем подебажить твои отрывки кода в своих головах? тогда тебе в тему "Экстрасенсы говорят".Если хочется подебажить, то можно сделать тестовый солюшен с сервисом и обращением. Сделать? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2012, 14:30 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
Попробовал через Task.ContinueWhenAll. Все отработало замечательно. Прилагаю тестовый проект под 5-й SL. Как бы сделать подобное под четвертым, где нет Task'ов? Обновиться до пятого возможности пока нет. Попробовал Rx под четвертым. Не получилось. Думаю, Rx предназначен скорее для работы с массивами данных генерируемыми мышкой, нежели с "действиями". Возможно не прав. P.S. В тестовом проекте есть интересный момент - обработчики WebClient.DownloadStringCompleted отрабатывают после параметра Action<Tasks[]> continuationAction метода Task.Factory.ContinueWhenAll, хотя сначала выполняется код методов Get. Поэтому сначала выводится сообщение "Complete", а затем пара "Got 1-й/2-й". ... |
|||
:
Нравится:
Не нравится:
|
|||
13.06.2012, 12:53 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
enigmaticВ тестовом проекте есть интересный момент ... Все правильно. Сначала выполняется код тасков, затем завершающий метод (continuationAction) и потом обработчики DownloadStringCompleted. Потому как continuationAction не будет ожидать обработчиков без соответствующей обработки. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2012, 06:35 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
enigmaticВсе правильно.Всё не правильно. :-) Вместо Код: c# 1. 2. 3. 4. 5. 6.
должно быть что-то вроде Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
зы: для синхронизации вместо явного вызова Dispatcher.BeginInvoke можно использовать контекст синхронизации. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2012, 07:25 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
Алексей КВсё не правильно. :-)Тот пример был написан на скорую руку и необдуманно. :) Попробовал пример обертки EAP (Event-based Async Pattern) с MSDN ( линк (раздел Exposing Complex EAP Operations As Tasks) и линк ). Под нормальным дотнетом работает, под SL - виснет. Видимо, под SL опять тонкости, связанные с UI-потоком. Прилагаю тестовые проекты под раром, они оба используют один и тот же "AsyncService"-класс для обертки EAP в таск: ConsoleApplication1 - нормальный дотнет, testTplTask - сильверлайт. Если пробовать дебажить, то лучше начать с SL-проекта, чтобы поднять локальный вебсервер, на который будет потом коннектиться нормальный дотнет. Алексей КВместо Код: c# 1. 2. 3. 4. 5. 6.
должно быть что-то вроде Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Спасибо, попробую.Алексей Кзы: для синхронизации вместо явного вызова Dispatcher.BeginInvoke можно использовать контекст синхронизации.Тоже попробую. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2012, 08:17 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
enigmatic, авторПрилагаю тестовые проекты под раром, ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2012, 09:42 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
Алексей Кдолжно быть что-то вроде Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Похоже, Task.Factory.FromAsync(...) применяется для оборачивания таких методов как HttpWebRequest.BeginResponse/EndResponse (которые Async Programming Model), но не WebClient.DownloadStringAsync/DownloadStringCompleted (которые Event-based Async Pattern). По крайней мере, применить FromAsync к DownloadStringCompleted не получилось. Для обертки EAP, судя по всему, предназначен TaskCompletionSource. Но его использование под SL, похоже, вешает UI поток. Причем, похоже, TaskCompletionSource вешает его только под SL, но не в обычном .NET. Гуглинг по использованию FromAsync для WebClient.DownloadStringCompleted не помог найти ничего нужного, но вместо этого дал отсылку к TaskCompletionSource ( секция Converting an Event-Based Pattern ). ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2012, 13:06 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
Алексей К, Не приходилось ли оборачивать WebClient с его DownloadStringAsync/DownloadStringCompleted в Task используя Task.Factory.FromAsync(...)? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2012, 13:09 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
enigmaticПохоже, Task.Factory.FromAsync(...) применяется для оборачивания таких методов как HttpWebRequest.BeginResponse/EndResponse (которые Async Programming Model), но не WebClient.DownloadStringAsync/DownloadStringCompleted (которые Event-based Async Pattern). По крайней мере, применить FromAsync к DownloadStringCompleted не получилось.Согласен. Может как-то и можно, но у меня тоже не получилось. :-) С другой стороны через TaskCompletionSource всё просто. Не запускал, но вроде должно работать: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
В случае с Силверлайтом - не знаю, надо думать, у нас тут жара аж капец... :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2012, 13:29 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
enigmaticПочему бы не использовать HttpWebRequest.BeginGetResponse/EndGetResponse? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2012, 13:46 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
Алексей КС другой стороны через TaskCompletionSource всё просто. Не запускал, но вроде должно работать: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32.
Хм ... :) Использовать TaskCompletionSource в методе возврата Task. Хорошая мысль. Даже как-то не подумалось о такой возможности. Алексей КВ случае с Силверлайтом - не знаю, надо думать, у нас тут жара аж капец... :-)Попробовал, благополучно виснет, причем только под SL. То ли TaskCompleteSource вешает UI, то ли я что-то совсем не так делаю :) Мы тоже кондиционеры на полную выкручиваем. Алексей КПочему бы не использовать HttpWebRequest.BeginGetResponse/EndGetResponse?Надо будет попробовать. Но подгонять задачу (расправиться с WebClient'ом) под средства (Task'и) не наш метод же! ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2012, 14:14 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
enigmaticПопробовал, благополучно виснет, причем только под SL...Тестовый код сейчас выглядит примерно так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2012, 14:18 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
enigmaticНо подгонять задачу (расправиться с WebClient'ом) под средства (Task'и) не наш метод же!Боюсь, ничего хорошего из этого не выйдет. Мне кажется, WebClient с его встроенной синхронизацией и Task-и вещи взаимоисключающие. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2012, 15:01 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
enigmaticТестовый код сейчас выглядит примерно так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
Так конечно, правильно что виснет. :-) Надо как-то так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2012, 15:25 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
Алексей К, Но ведь консольное приложение отрабатывает нормально. Уверен, проблемы из-за отличия CLR SL от CLR обычного дотнета. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.06.2012, 15:35 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
enigmaticНо ведь консольное приложение отрабатывает нормально. Уверен, проблемы из-за отличия CLR SL от CLR обычного дотнета.Нет. Отличие в том, что приложение консольное. А в силверлайтном приложении возникает мёртвая блокировка. Ожидание завершения при обращении к свойству task.Result в конструкторе в гуйном потоке + событие завершения идёт в гуйном потоке == мёртвая блокировка. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2012, 05:52 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
Все отличия из-за того, что в Силверлайте DownloadStringCompleted синхронизирован с гуйным потоком. Но эти отличия были бы видны при сравнении с например WPF-ным приложением. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.06.2012, 05:54 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
enigmaticМогут ли возникнуть ошибки одновременного доступа к объекту в следующем коде? Код выполняется в Silverlight. Есть некий сервис, запрашивающий данные: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
И есть код: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Здесь происходит несколько одновременных запросов, по завершении которых происходит вызов DoSmthElse(); Достигается это за счет использования переменной asyncCounter. Будут ли проблемы при использовании этой одной переменной в обработчиках разных запросов в Silverlight? Могут и будут. Асинхронные вызовы могут выполняться в разной последовательности, вызовы нужно делать с дополнительным параметром state, который нужно анализировать в обработчике. Помимо этого есть утечки памяти. При множественных вызовах webrequest - более предпочтительных вариант, тк нет лишней диспетчеризации в ui поток. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2012, 11:06 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
Алексей КВсе отличия из-за того, что в Силверлайте DownloadStringCompleted синхронизирован с гуйным потоком. Но эти отличия были бы видны при сравнении с например WPF-ным приложением. Привильно здесь deadlock, а task'и - унылый гумос. rx в разы удобней и лучше.В особенности для клиентских приложений ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2012, 11:10 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
SeVaа task'и - унылый гумос. rx в разы удобней и лучше.В особенности для клиентских приложенийДля построения цепочки асинхронных операций таски удобны. Всё просто и ничего лишнего. Покажи как будет выглядеть аналогичный код на Rx. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2012, 12:07 |
|
[SL] Одна переменная для нескольких обработчиков
|
|||
---|---|---|---|
#18+
Элементарно Код: c# 1. 2. 3. 4. 5.
Пример и вопрос примитивный, тк task'и только под это заточены, а у rx возможностей больше ... |
|||
:
Нравится:
Не нравится:
|
|||
16.06.2012, 12:44 |
|
|
start [/forum/topic.php?fid=21&msg=37803589&tid=1441749]: |
0ms |
get settings: |
7ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
74ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 167ms |
0 / 0 |