You need to have almost to threads (or processes) to handle this situation
1) You'll need an interrup server for each source that will receive each interrupt and add the relevant info into a list. During the process of the interrupt you need to discard any other call to the same interrupt using a processing flag.
2) The second will verify if the list is not empty to get the info from position 0 in the list, remove this position from it and process the relevant interrupt (maybe you need a backgroud worker for that process). In this thread, do not forget to call as many DoEvents as you can.
In order to manage the list, you will need an object (generic) to be locked by each process to access the list, then free it.
The list can be an inmemory list or, if you need persistence, and the response time is enough fast, you can use a table in a database to handle the list.
Hope that those ideas help you.