несмотря на то, что компилятор добавляет [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