Implementing asynchronous events – producers and observers