Что ж, если событие вызывается в том же потоке (как я понимаю, это может быть требованием), тогда вы ничего не можете с этим поделать.
Если это приложение Win32 с насосом сообщений, вы можете зарегистрировать сообщение Windows и вызвать PostMessage
с данными, представляющими это событие, и вы можете залатать цикл сообщений, чтобы интерпретировать это сообщение и вызвать событие. То, что вы получаете, - это своего рода разъединение, вызов события является асинхронным (т.е. вызов события будет возвращаться независимо от того, что). Но позже, когда вы обработаете свои сообщения и фактически вызовете событие, ваш основной поток все равно будет остановлен, и больше ничего не будет работать, пока не будет готов обработчик события.
Другой альтернативой является просто создание нового потока (или использование пула потоков) для вашего вызова. Это не будет работать для событий, которые требуют определенного потока (т.е. обновления потоков пользовательского интерфейса). Кроме того, это добавляет накладные расходы на синхронизацию и порождающие потоки, и вы можете лишить систему потоков и / или времени процессора.
Но на самом деле, я не думаю, что ваша работа как дизайнера библиотеки - предвидеть и избегать этих проблем. Если конечный пользователь хочет создать обработчик длинных событий, пусть он сам создает новый поток. Если он этого не делает и просто хочет, чтобы его конкретная нить обрабатывала событие, позвольте ему. Это упрощает вашу работу и не добавляет ненужных накладных расходов.