|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
Есть класс (пишу по памяти с телефона) Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
И Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
В классе B создаем событие, в классе A подписываемся на него. Данная конструкция многократно используется в коде и в одном случае не работает. Работает так, как будто нет подписчиков у события. Если при объявлении события инициализировать его пустым делегатом, то, естественно, в методе OnChange класса B проверка на null проходит, но Update класса A не вызывается. В чем может быть проблема? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 09:23 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
csprogrammist Код: c# 1. 2. 3. 4.
Можно переписать так: Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 10:57 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
hVosttcsprogrammist Код: c# 1. 2. 3. 4.
Можно переписать так: Код: c# 1.
1. На работоспособность не повлияет. 2. Использую Framework 4.0 (данная конструкция только от C# v.6) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 11:14 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
А вот в причине такого "бездействия" пока разобраться не могу. В приложении повсеместно используется IoC и mvvm-framework. Может это как-то влияет. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 11:15 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
csprogrammist, кто на ком стоял... ? IoC тут ни при чем... даже если такую конструкцию вам не отдебажить, то с с контейнерами - можно вешаться. Кто вызывает OnChange ? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 11:29 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
csprogrammistА вот в причине такого "бездействия" пока разобраться не могу. В приложении повсеместно используется IoC и mvvm-framework. Может это как-то влияет.Может есть смысл написать и представить рабочий показательный пример в виде простенького консольного приложения, иллюстрирующий проблему? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 11:30 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
да скорее всего где то отписка происходит или не подписывается, по этому на сферической примере всё будет нормально ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 11:36 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
Алексей КcsprogrammistА вот в причине такого "бездействия" пока разобраться не могу. В приложении повсеместно используется IoC и mvvm-framework. Может это как-то влияет.Может есть смысл написать и представить рабочий показательный пример в виде простенького консольного приложения, иллюстрирующий проблему? Я больше чем уверен, что в консольном будет работать. Писал, что данная конструкция встречается у меня в коде части и всегда работает. Чуть позже настрочу код. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 11:39 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
Roman Mejtesда скорее всего где то отписка происходит или не подписывается, по этому на сферической примере всё будет нормально Это единственный вариант, который и у меня возникает, но с классом B больше "никто не работает". Только в методе Update класса A вызывается метод класса B (в данном методе реализован простой возврат значения и никаких упоминаний о событиях) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 11:41 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
csprogrammist1. На работоспособность не повлияет. 2. Использую Framework 4.0 (данная конструкция только от C# v.6) Повлияет, мой вариант безопасней. Или добавь предварительное сохранение Change в локальную переменную, потом уже проверяй на null. Вот так: Код: c# 1. 2. 3. 4. 5. 6. 7.
Что касается конструкции ?., это сахар языка, а не платформы. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 11:45 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
csprogrammist, Добавь логгирование на подписку, для этого реализуй события add/remove у события самостоятельно. Будешь знать кто чего когда. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 11:46 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
hVosttПовлияет, мой вариант безопасней. Или добавь предварительное сохранение Change в локальную переменную, потом уже проверяй на null. Вот так: Код: c# 1. 2. 3. 4. 5. 6. 7.
Рихтер, помнится, писал, что компилятор может в результате оптимизации выкинуть локальную переменную, и завещал делать как-то так: Код: c# 1. 2. 3. 4. 5. 6.
однако меня гложут сомнения, что причина ошибки в том, что отписка происходит во время проверки - автор сам выше писал, что работает так, как будто нет подписчиков у события . Просто где-то косяк в логике выполнения, когда подписки просто не происходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 11:59 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
hVosttcsprogrammist1. На работоспособность не повлияет. 2. Использую Framework 4.0 (данная конструкция только от C# v.6) Повлияет, мой вариант безопасней. Или добавь предварительное сохранение Change в локальную переменную, потом уже проверяй на null. Вот так: Код: c# 1. 2. 3. 4. 5. 6. 7.
Что касается конструкции ?., это сахар языка, а не платформы. У меня так и реализовано, но данная конструкция все равно не является абсолютно потокобезопасной )) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 12:12 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныРихтер, помнится, писал, что компилятор может в результате оптимизации выкинуть локальную переменную, и завещал делать как-то так: Или ещё можно указать переменную с помощью KeepAlive в конце функции. Но в целом, достаточно воспользоваться конструкцией event?.Invoke() ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 12:21 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныhVosttПовлияет, мой вариант безопасней. Или добавь предварительное сохранение Change в локальную переменную, потом уже проверяй на null. Вот так: Код: c# 1. 2. 3. 4. 5. 6. 7.
Рихтер, помнится, писал, что компилятор может в результате оптимизации выкинуть локальную переменную, и завещал делать как-то так: Код: c# 1. 2. 3. 4. 5. 6.
однако меня гложут сомнения, что причина ошибки в том, что отписка происходит во время проверки - автор сам выше писал, что работает так, как будто нет подписчиков у события . Просто где-то косяк в логике выполнения, когда подписки просто не происходит. Он, вроде, через volatile предлагал реализовывать, чтобы оптимизация не сработала ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 12:21 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
csprogrammistУ меня так и реализовано, но данная конструкция все равно не является абсолютно потокобезопасной )) События на основе цепочек делегатов вообще тотальный фейл в архитектуре платформы. Лучше использовать какую-нибудь свою событийную модель, шину событий, двойную диспетчеризацию и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 12:23 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
hVosttcsprogrammist, Добавь логгирование на подписку, для этого реализуй события add/remove у события самостоятельно. Будешь знать кто чего когда. Реализовал. Подписчики есть, но "никто" не отписывается. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 12:26 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
csprogrammistОн, вроде, через volatile предлагал реализовывать, чтобы оптимизация не сработала Через Thread.VolatileRead, который его не устроил отсутствием генерик-перегрузки, и которая есть у Interlocked.CompareExchange. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 12:30 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
Господа, прошу прощения. Добрался до кода и перепроверил. Проверку на null проходит и change.Invoke (); выполняет, но Update не срабатывает ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 12:34 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
csprogrammistГоспода, прошу прощения. Добрался до кода и перепроверил. Проверку на null проходит и change.Invoke (); выполняет, но Update не срабатывает Реализовал по-другому. Класс A у меня создается в классе С. В классе С при создании экземпляра класса A и сделал подписку. Работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 12:57 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
csprogrammistcsprogrammistГоспода, прошу прощения. Добрался до кода и перепроверил. Проверку на null проходит и change.Invoke (); выполняет, но Update не срабатывает Реализовал по-другому. Класс A у меня создается в классе С. В классе С при создании экземпляра класса A и сделал подписку. Работает. Типа того Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 13:10 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
hVostt События на основе цепочек делегатов вообще тотальный фейл в архитектуре платформы. . Почему? А? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 17:25 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
ЕвгенийВПочему? А? Потому что слишком много не очевидного поведения, особенно в многопоточной среде. А всё, что не очевидно, однозначно плохо. По крайне мере в большинстве случаев. ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 20:33 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
hVosttЕвгенийВПочему? А? Потому что слишком много не очевидного поведения, особенно в многопоточной среде. А всё, что не очевидно, однозначно плохо. По крайне мере в большинстве случаев. А если соорудить простенький код с событием и попробовать дизассемблировать его, только не убогими поделками от телерика и джетбрайнса? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 20:48 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
ЕвгенийВА если соорудить простенький код с событием и попробовать дизассемблировать его, только не убогими поделками от телерика и джетбрайнса? Убогие? Что же тогда называть богом данные поделки? Таки что ты хочешь сказать? ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 21:01 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
hVostt, ну х.з., как то, лет 10 назад, мой друг накропал код выстреливать обработчик события в отдельный поток каждому подписчику - он очень удивился высокой производительности (а я нет - всегда верил мокрософтам) ... |
|||
:
Нравится:
Не нравится:
|
|||
07.02.2017, 22:51 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
LR, угу, для этого надо раскалупать цепочку делегатов. с асинками ещё интереснее. всё решаемо, но надо отдать должное, для своего времени было норм, сейчас проще использовать что-то своё. хотя бы, чтобы не писать всякие расширения, типа SafeEventInvoker, SafeEventInvokerAsync... ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2017, 08:21 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
hVosttЕвгенийВА если соорудить простенький код с событием и попробовать дизассемблировать его, только не убогими поделками от телерика и джетбрайнса? Убогие? Что же тогда называть богом данные поделки? Таки что ты хочешь сказать? На самом деле компилятор сварганит нечто подобное. Код: 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87.
Для многопоточной среды самый то. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2017, 11:14 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
ЕвгенийВ, А наезды на JetBrains и Telerik были к чему? ЕвгенийВНа самом деле компилятор сварганит нечто подобное. Не вижу у тебя вызова события. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
IL: Код: 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. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135.
Как видим, если использовать вызов через ?., то CompareExchange не нужен, и оптимизация компилятора ничего не уберёт. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2017, 11:57 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
Кстати, IL получен через dotPeek ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2017, 11:58 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
hVostt, Таки с потокобезопасностью то все нормально, насколько это возможно? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2017, 17:26 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
ЕвгенийВhVostt, Таки с потокобезопасностью то все нормально, насколько это возможно? Учитывая, что event это всего лишь абстракция, могли бы реализовать потокобезопасный Invoke. Странно, что этого не сделали. Ещё не нравится реализация цепочек делегатов. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2017, 20:21 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
hVostt, Цепочка делегатов есть неизменяемая субстанция, самый то для многопоточности! ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2017, 22:50 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
ЕвгенийВhVostt, Цепочка делегатов есть неизменяемая субстанция, самый то для многопоточности! Да ни для чего это не самое то, кроме как для событий. В большинстве случаев лишний и не очевидный оверхед. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2017, 23:52 |
|
Вопрос по событиям
|
|||
---|---|---|---|
#18+
Надеялся что jit оптимизирует, но :( Код: c# 1. 2. 3.
Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.02.2017, 11:30 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1400056]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 162ms |
0 / 0 |