use Event to improve the cancellation mechanism
Add comments and a new test case
README: fix a typo