Несколько потоков подписавшись же событие

Что произойдет, когда 10 потоков подпишутся на одно и то же событие и событие загорится? Какая нить его подхватит?

6 ответов


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

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


Если под "событием" вы подразумеваете событие синхронизации Win32 (именно так я читаю вопрос), то это зависит от того, как создается EventWaitHandle. Если его ручной сброс, событие будет сигнализировать все потоки и все будет выполняться. Если его автоматический сброс, один поток будет сигнализирован и выполнен. Любой из ваших 10 потоков, ожидающих события, может быть выбран.


Я думаю, что вы имеете в виду, что несколько объектов в отдельных потоках подписываются на событие.

все обработчики будут вызываться, но в том же потоке, который вызвал событие.


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


Если вы хотите знать, какой объект подберет событие, каждый объект, подписавшийся на событие, подберет это событие, но каждый будет работать в потоке, в котором произошло событие.

Если вы хотите знать, какой объект подберет это событие, сначала см. ответ ultrajohns.


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

ответ: поскольку выполнение обработчика событий происходит в том же потоке, который его запускает (в этом случае поток обработки вашего объекта) , может обрабатывать только один функция обработчика одновременно. Заказ не гарантируется (это означает, что не обязательно первый подписчик будет выполнен первым, а последний будет выполнен последним). Надеюсь, это ответ на ваш вопрос. Суть всех 10 обработчик будет называться и никто бы параллельно. Они будут казнены один за другим. Я видел, как люди случайно подписываются на сохранение события дважды, а затем видят действие дважды и с трудом понимают, почему некоторые вещи происходят несколько раз.