Note that cancel will not terminate until the thread the Async refers to has terminated. This means that cancel will block for as long said thread blocks when receiving an asynchronous exception.
For example, it could block if:
It's executing a foreign call, and thus cannot receive the asynchronous exception;
It's executing some cleanup handler after having received the exception, and the handler is blocking.