mainQueueって、RunLoopで処理されるキューでしょ?
cancelしたあと、一度RunLoopに戻ってみたら?