I think what you want is that your simulate() code should check to see if it has been sent a message to terminate prematurely (on a Channel).
Yes, do this, then run timedwait and at the end of the timeout if the callback hasn’t collected all the results, send the “abort” message over the channel to the simulate code.
What this seems to do is avoid an unsafe exit via “throw an exception” into the task… potentially leaving things in an inconsistent state and preventing further safe computation. I’m not clear on if there’s a safe way to simply “kill” a task.