У меня есть класс, который публикует обработчик событий:
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
}
или это не обязательно, если прикрепленное событие правильно обрабатывает ситуацию? (Я предполагаю, что если три потока запускают событие одновременно, прикрепленный код также выполняется три раза в разных потоках).
someEvent
? Отдельно стоит отметить, что выполнение работы в конструкторе обычно является плохой идеей. - person Kit   schedule 11.03.2019Is 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.2019someEvent
. - person Kit   schedule 11.03.2019