event криво синхронизирован?
От: mihhon  
Дата: 10.11.10 11:01
Оценка:
несмотря на то, что компилятор добавляет [MethodImpl(MethodImplOptions.Synchronized)] к add/remove

[MethodImpl(MethodImplOptions.Synchronized)] — эквивалентно lock(this) на всё тело метода ?

private event Handler<E> OnEvent0;

[MethodImpl(MethodImplOptions.Synchronized)]
private void add_OnEvent0(Handler<E> value)
{
    this.OnEvent0 = (Handler<E>) Delegate.Combine(this.OnEvent0, value);
}
[MethodImpl(MethodImplOptions.Synchronized)]
private void remove_OnEvent0(Handler<E> value)
{
    this.OnEvent0 = (Handler<E>) Delegate.Remove(this.OnEvent0, value);
}


что должно по идее синхронизировать операции добавления/удаления листенеров event-а. Но эффекты, которые появляются при добавлении/удалении из нескольких thread-ов наводят на мысль, что какая-то кривизна присутствует. Если явно += и -= вызывать из блока lock(this) , то работает корректно

никаких экзотических вещей типа описанных здесь http://www.yoda.arachsys.com/csharp/events.html не делаю, никаких статических event-ов нет

это известный факт ? есть тест, но его надо доработать, чтоб можно было легко запустить

.NET Framework 3.5 SP1
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.