Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
07.02.2017, 09:23
|
|||
---|---|---|---|
|
|||
Вопрос по событиям |
|||
#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, 10:57
|
|||
---|---|---|---|
Вопрос по событиям |
|||
#18+
csprogrammist Код: c# 1. 2. 3. 4.
Можно переписать так: Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 11:14
|
|||
---|---|---|---|
|
|||
Вопрос по событиям |
|||
#18+
hVosttcsprogrammist Код: c# 1. 2. 3. 4.
Можно переписать так: Код: c# 1.
1. На работоспособность не повлияет. 2. Использую Framework 4.0 (данная конструкция только от C# v.6) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 11:15
|
|||
---|---|---|---|
|
|||
Вопрос по событиям |
|||
#18+
А вот в причине такого "бездействия" пока разобраться не могу. В приложении повсеместно используется IoC и mvvm-framework. Может это как-то влияет. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 11:29
|
|||
---|---|---|---|
Вопрос по событиям |
|||
#18+
csprogrammist, кто на ком стоял... ? IoC тут ни при чем... даже если такую конструкцию вам не отдебажить, то с с контейнерами - можно вешаться. Кто вызывает OnChange ? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 11:30
|
|||
---|---|---|---|
Вопрос по событиям |
|||
#18+
csprogrammistА вот в причине такого "бездействия" пока разобраться не могу. В приложении повсеместно используется IoC и mvvm-framework. Может это как-то влияет.Может есть смысл написать и представить рабочий показательный пример в виде простенького консольного приложения, иллюстрирующий проблему? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 11:36
|
|||
---|---|---|---|
|
|||
Вопрос по событиям |
|||
#18+
да скорее всего где то отписка происходит или не подписывается, по этому на сферической примере всё будет нормально ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 11:39
|
|||
---|---|---|---|
|
|||
Вопрос по событиям |
|||
#18+
Алексей КcsprogrammistА вот в причине такого "бездействия" пока разобраться не могу. В приложении повсеместно используется IoC и mvvm-framework. Может это как-то влияет.Может есть смысл написать и представить рабочий показательный пример в виде простенького консольного приложения, иллюстрирующий проблему? Я больше чем уверен, что в консольном будет работать. Писал, что данная конструкция встречается у меня в коде части и всегда работает. Чуть позже настрочу код. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 11:41
|
|||
---|---|---|---|
|
|||
Вопрос по событиям |
|||
#18+
Roman Mejtesда скорее всего где то отписка происходит или не подписывается, по этому на сферической примере всё будет нормально Это единственный вариант, который и у меня возникает, но с классом B больше "никто не работает". Только в методе Update класса A вызывается метод класса B (в данном методе реализован простой возврат значения и никаких упоминаний о событиях) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 11:45
|
|||
---|---|---|---|
Вопрос по событиям |
|||
#18+
csprogrammist1. На работоспособность не повлияет. 2. Использую Framework 4.0 (данная конструкция только от C# v.6) Повлияет, мой вариант безопасней. Или добавь предварительное сохранение Change в локальную переменную, потом уже проверяй на null. Вот так: Код: c# 1. 2. 3. 4. 5. 6. 7.
Что касается конструкции ?., это сахар языка, а не платформы. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 11:46
|
|||
---|---|---|---|
Вопрос по событиям |
|||
#18+
csprogrammist, Добавь логгирование на подписку, для этого реализуй события add/remove у события самостоятельно. Будешь знать кто чего когда. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 11:59
|
|||
---|---|---|---|
|
|||
Вопрос по событиям |
|||
#18+
hVosttПовлияет, мой вариант безопасней. Или добавь предварительное сохранение Change в локальную переменную, потом уже проверяй на null. Вот так: Код: c# 1. 2. 3. 4. 5. 6. 7.
Рихтер, помнится, писал, что компилятор может в результате оптимизации выкинуть локальную переменную, и завещал делать как-то так: Код: c# 1. 2. 3. 4. 5. 6.
однако меня гложут сомнения, что причина ошибки в том, что отписка происходит во время проверки - автор сам выше писал, что работает так, как будто нет подписчиков у события . Просто где-то косяк в логике выполнения, когда подписки просто не происходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 12:12
|
|||
---|---|---|---|
|
|||
Вопрос по событиям |
|||
#18+
hVosttcsprogrammist1. На работоспособность не повлияет. 2. Использую Framework 4.0 (данная конструкция только от C# v.6) Повлияет, мой вариант безопасней. Или добавь предварительное сохранение Change в локальную переменную, потом уже проверяй на null. Вот так: Код: c# 1. 2. 3. 4. 5. 6. 7.
Что касается конструкции ?., это сахар языка, а не платформы. У меня так и реализовано, но данная конструкция все равно не является абсолютно потокобезопасной )) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 12:21
|
|||
---|---|---|---|
Вопрос по событиям |
|||
#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:23
|
|||
---|---|---|---|
Вопрос по событиям |
|||
#18+
csprogrammistУ меня так и реализовано, но данная конструкция все равно не является абсолютно потокобезопасной )) События на основе цепочек делегатов вообще тотальный фейл в архитектуре платформы. Лучше использовать какую-нибудь свою событийную модель, шину событий, двойную диспетчеризацию и т.п. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 12:26
|
|||
---|---|---|---|
|
|||
Вопрос по событиям |
|||
#18+
hVosttcsprogrammist, Добавь логгирование на подписку, для этого реализуй события add/remove у события самостоятельно. Будешь знать кто чего когда. Реализовал. Подписчики есть, но "никто" не отписывается. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 12:30
|
|||
---|---|---|---|
|
|||
Вопрос по событиям |
|||
#18+
csprogrammistОн, вроде, через volatile предлагал реализовывать, чтобы оптимизация не сработала Через Thread.VolatileRead, который его не устроил отсутствием генерик-перегрузки, и которая есть у Interlocked.CompareExchange. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 12:34
|
|||
---|---|---|---|
|
|||
Вопрос по событиям |
|||
#18+
Господа, прошу прощения. Добрался до кода и перепроверил. Проверку на null проходит и change.Invoke (); выполняет, но Update не срабатывает ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 12:57
|
|||
---|---|---|---|
|
|||
Вопрос по событиям |
|||
#18+
csprogrammistГоспода, прошу прощения. Добрался до кода и перепроверил. Проверку на null проходит и change.Invoke (); выполняет, но Update не срабатывает Реализовал по-другому. Класс A у меня создается в классе С. В классе С при создании экземпляра класса A и сделал подписку. Работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 13:10
|
|||
---|---|---|---|
|
|||
Вопрос по событиям |
|||
#18+
csprogrammistcsprogrammistГоспода, прошу прощения. Добрался до кода и перепроверил. Проверку на null проходит и change.Invoke (); выполняет, но Update не срабатывает Реализовал по-другому. Класс A у меня создается в классе С. В классе С при создании экземпляра класса A и сделал подписку. Работает. Типа того Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 17:25
|
|||
---|---|---|---|
Вопрос по событиям |
|||
#18+
hVostt События на основе цепочек делегатов вообще тотальный фейл в архитектуре платформы. . Почему? А? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 20:33
|
|||
---|---|---|---|
Вопрос по событиям |
|||
#18+
ЕвгенийВПочему? А? Потому что слишком много не очевидного поведения, особенно в многопоточной среде. А всё, что не очевидно, однозначно плохо. По крайне мере в большинстве случаев. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 20:48
|
|||
---|---|---|---|
Вопрос по событиям |
|||
#18+
hVosttЕвгенийВПочему? А? Потому что слишком много не очевидного поведения, особенно в многопоточной среде. А всё, что не очевидно, однозначно плохо. По крайне мере в большинстве случаев. А если соорудить простенький код с событием и попробовать дизассемблировать его, только не убогими поделками от телерика и джетбрайнса? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.02.2017, 21:01
|
|||
---|---|---|---|
Вопрос по событиям |
|||
#18+
ЕвгенийВА если соорудить простенький код с событием и попробовать дизассемблировать его, только не убогими поделками от телерика и джетбрайнса? Убогие? Что же тогда называть богом данные поделки? Таки что ты хочешь сказать? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=20&mobile=1&tid=1400056]: |
0ms |
get settings: |
12ms |
get forum list: |
11ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
41ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
2ms |
others: | 288ms |
total: | 441ms |
0 / 0 |