Несколько Потоков, подписывающих то же событие

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

8
задан James 13 August 2010 в 19:16
поделиться

6 ответов

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

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

16
ответ дан 5 December 2019 в 08:22
поделиться

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

0
ответ дан 5 December 2019 в 08:22
поделиться

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

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

0
ответ дан 5 December 2019 в 08:22
поделиться

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

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

0
ответ дан 5 December 2019 в 08:22
поделиться

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

3
ответ дан 5 December 2019 в 08:22
поделиться

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

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

1
ответ дан 5 December 2019 в 08:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: