Несколько потоков, использующих один и тот же обработчик событий

У меня есть класс, который публикует обработчик событий:

public class X
{
    public event EventHandler<T> someEvent;
}

В конструкторе я использую несколько потоков. Во всех этих потоках я выполняю это событие, если возникает какое-то условие:

someEvent?.Invoke(this, new T()); //T will eventually contain some output data

Правильно ли предположить, что если несколько потоков вызывают событие одновременно, это не должно быть проблемой, если присоединенный обработчик событий знает, как справиться с проблемой многопоточности? Например, если прикрепленное событие использует какой-либо механизм блокировки или некоторый параллельный сбор для обработки выходных данных? Или это должно быть обработано как-то по-другому?

В качестве дополнительного вопроса: Должен ли я заблокировать доступ к событию из класса:

lock(lockingObj)
{
    someEvent?.Invoke(this, new T()); //T will eventually contain some output data
}

или это не обязательно, если прикрепленное событие правильно обрабатывает ситуацию? (Я предполагаю, что если три потока запускают событие одновременно, прикрепленный код также выполняется три раза в разных потоках).


person Ulf Honkanen    schedule 10.03.2019    source источник
comment
Вам нужно будет добавить дополнительную информацию. Когда, например, устанавливается someEvent? Отдельно стоит отметить, что выполнение работы в конструкторе обычно является плохой идеей.   -  person Kit    schedule 11.03.2019
comment
Работа выполняется в потоках, а не в конструкторе. Конструктор... создает потоки. Вот для чего нужен конструктор.   -  person Ulf Honkanen    schedule 11.03.2019
comment
Is it correct to assume that if several threads call the event at the same time, it should be no problem as long as the attached event handler knows how to deal with the multithreading issue Да, это правильно. События потокобезопасны, по крайней мере, начиная с .net 2.0 (не уверен в 1.1, но кого это больше волнует)   -  person Kevin Gosse    schedule 11.03.2019
comment
Достаточно справедливо, что работа не выполняется в конструкторе. Если потоки блокируются на общем корне синхронизации, кажется, что все должно быть в порядке, как упомянул Кевин. Я беспокоился о том, когда был назначен someEvent.   -  person Kit    schedule 11.03.2019