Если вы хотите использовать повторно используемое решение, вы можете применить шаблон асинхронного проектирования, который распространен в .NET, но также может быть реализован в C ++, как продемонстрировано в этом проекте CodeProject .
Нет ничего плохого в том, чтобы обеспечить синхронные и асинхронные вызовы одной и той же функции в интерфейсе.
Лично я бы пошел на эти длины только в том случае, если мне нужно обслуживать несколько запросов (в этом случае, например, вы можете поставить в очередь запросы «BeginOperation») или если в интерфейсе много потенциально асинхронных операций (и я хочу стандартизированный, гибкий шаблон). Если вы можете обрабатывать только один запрос за раз, обычно достаточно тайм-аута.