![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
neutrino |
|
||||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 3 Всего: 62 |
Привет!
Вот, собственно, если написать код:
То если случился context switch между проверкой и вызовом someEvent, и тот поток, который получил процессорное время отписал обработчик события, то мы получим NullReferenceException, т.к. someEvent уже будет null. Майкрософт (чтоб она сдохла) нашла "решение" для этой ситуации и даже вписала для него сниппет "invoke":
Гы ![]() -------------------- The truth comes from within ... Покойся с миром, Vit |
||||
|
|||||
Bogdan1024 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1436 Регистрация: 28.9.2005 Где: Киев Репутация: 5 Всего: 13 |
Добавлено через 10 минут и 50 секунд Наверно, можно ещё lock'чить someEvent чтобы никто от него не мог отписываться. Это сообщение отредактировал(а) Bogdan1024 - 29.6.2008, 12:33 -------------------- ![]() |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
neutrino, а разве переменная temp не будет ссылаться на тот же экземпляр делегата? Если так, то временная переменная бессмысленна.
|
|||
|
||||
Bogdan1024 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1436 Регистрация: 28.9.2005 Где: Киев Репутация: 5 Всего: 13 |
Я проверял кодом: реально никто ни на кого ссылаться не будет.
Это сообщение отредактировал(а) Bogdan1024 - 29.6.2008, 13:46 -------------------- ![]() |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
neutrino, спасибо за интересную тему. +1
Bogdan1024, действительно, значения копируются не по ссылке, а по значению. Интересно, с чего бы это... |
|||
|
||||
neutrino |
|
||||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 3 Всего: 62 |
Да. Можно. Но вот представь себе сколько событий бывает... Да и performance... Можно ведь делать что-то типа:
Ну это так "навскидку". Сейчас будем искать неточности и баги... -------------------- The truth comes from within ... Покойся с миром, Vit |
||||
|
|||||
marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
(глюк)
Это сообщение отредактировал(а) marcusmae - 29.6.2008, 17:02 -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
marcusmae |
|
||||||||||||||||||||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Читаем первый попавшийся в поиске блог :
Не вижу ничего необычного в такой ситуации, это возможно вообще для любой переменной, не только для события.
Тут Вы горячитесь. Что имеется в виду :
То есть смысл копирования в потокобезопасности, а именно :
То есть, если someEvent изменится, а А - нет, то temp не изменится. Цитата gotdotnet.ru. Это сообщение отредактировал(а) marcusmae - 29.6.2008, 17:24 -------------------- ἀπὸ μηχανῆς θεός |
||||||||||||||||||||
|
|||||||||||||||||||||
Idsa |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
С Вашим примером все понятно: там другая ссылка присваивается. А вот с пониманием этого кода:
у меня возникли проблемы. Ведь здесь и eh1, и eh2 указывают на один и тот же объект в памяти. А ведут себя, как будто копировались по значению. А вообще, правда, не проще ли было завернуть if с проверкой в lock?! |
||||
|
|||||
PashaPash |
|
||||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
Создать ссылку в стеке намного проще и дешевле чем сделать lock. Это сообщение отредактировал(а) PashaPash - 2.7.2008, 18:21 |
||||
|
|||||
marcusmae |
|
|||
![]() stravaganza ![]() ![]() Профиль Группа: Участник Сообщений: 874 Регистрация: 26.3.2006 Репутация: 22 Всего: 39 |
Ну да. Конечно, широко употребимый snippet с if-ом просто не предназначен для решения специфических проблем многопоточности, чего нигде и не утверждается, а универсальное решение будет весьма ущербно в плане производительности. -------------------- ἀπὸ μηχανῆς θεός |
|||
|
||||
neutrino |
|
|||
![]() Gothic soul ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: 3 Всего: 62 |
marcusmae, Да я этo все понимаю. Нo вот получается, чтo если обработчик события отписался (между if и вызовом) то он все равно вызовется.
-------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |