Implementing the asynchronous communication design pattern