Несколько потоков подписываются на одно событие - PullRequest
8 голосов
/ 13 августа 2010

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

Ответы [ 6 ]

16 голосов
/ 13 августа 2010

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

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

3 голосов
/ 14 августа 2010

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

1 голос
/ 13 августа 2010

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

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

0 голосов
/ 14 августа 2010

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

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

0 голосов
/ 13 августа 2010

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

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

0 голосов
/ 13 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...