Что произойдет, когда 10 потоков подпишутся на то же событие и огни события? Какой поток возьмет его?
Потоки не подписываются на события, а объекты подписываются. Когда возникает событие, все зарегистрированные обработчики выполняются в одном потоке (том, который вызвал событие). Нет встроенного средства для запуска событий в нескольких потоках.
При желании обработчик может пересылать информацию о событии в отдельный поток, но это не является частью встроенного механизма отправки событий.
Ответ на ваш вопрос, я полагаю, зависит от реализации диспетчера событий ... Обычно вы используете список для отслеживания всех обработчиков событий, которые подписались на конкретное событие, поэтому, скорее всего, с точки зрения этого такая реализация, первый обработчик, который запускается, - это первый обработчик событий, на который была подписана подписка, если вы, конечно, вызываете все соответствующие процедуры синхронно, если нет, то это зависит ... просто мысль ..
Если вы хотите знать, какой объект перехватит событие, каждый объект, который подписывается на событие, подхватит это событие, но каждый будет работать в потоке, в котором произошло событие.
Если вы хотите узнать, какой объект сначала получит это событие, см. Ответ ultrajohns.
Думаю, если я понимаю ваш вопрос. Вы хотите спросить, что ваш объект предоставляет событие, на которое пользователь вашего объекта может подписаться. Если 10 разных пользователей вашего объекта подписались на это событие, и в какой-то момент вы запускаете событие, в каком порядке (или одновременно) будут вызываться обработчики событий?
Ответ : С момента выполнения обработчика события происходит в том же потоке, который его запускает (в данном случае поток обработки вашего объекта) может обрабатывать только одну функцию-обработчик за раз. Порядок не гарантирован (это означает, что не обязательно первый подписчик будет выполнен первым, а последний - последним). Надеюсь, это ответит на ваш вопрос. Суть в том, что будут вызваны все 10 обработчиков, и ни один из них не будет работать параллельно. Они будут выполняться один за другим. Я видел, как люди случайно добавляли индекс для сохранения события дважды, а затем видели, как действие происходит дважды, и им было трудно понять, почему некоторые вещи происходят несколько раз.
Если под «событием» вы подразумеваете Событие синхронизации Win32 (именно так я читаю вопрос), то это зависит от того, как создается EventWaitHandle. Если его сбросить вручную, событие будет сигнализировать обо всех потоках, и все будут выполнены. Если его автоматический сброс, один поток будет сигнализирован и выполнен. Можно выбрать любой из ваших 10 потоков, ожидающих события.
Я думаю, вы имеете в виду, что несколько объектов в разных потоках подписываются на событие.
Все обработчики будут вызваны, но в том же потоке, который вызвал событие.