There's a problem with the current implementation where if an action spawns an async things and let's the control return to the caller will trigger the pipeline logic, which will eventually call Cleanup & Response.End.
I propose a small change like:
(adjustable to have better apis and stuff, but the general idea), the thing that would happen is that if an action starts to run async, it will set this property to true, spawn a new thread oro call the pool, and when done, create an async watcher set it back to false to trigger the ppeline callbacks again.