Async Programming Patterns

Note To Self: In any system where you have multiple processes or tasks handling processing of various events and you provide a mechanism in one process or task for other modules to register a callback, you should also allow for a life-time parameter in the registration that is returned whenever the callback is called. This is so that if callbacks are processed asynchronously by queue-ing messages by the process registering callbacks, there can be stale messages in queue during which time the registration could be deleted and new registrations can happen. So there has to be a mechanism for the callback owner to be able to distinguish the life-time instance of the registration against which the callback was originally made.