CancelAsyncはキャンセル要求するだけで待たないよ。
また、中途半端で終わるのはAbort(非推奨)かプロセス終了なので、
Thread.CurrentThread.IsBackgroundをfalseにすれば完走すると思う。

画面側で待つかフォアクラウンドスレッドにするかどちらかだね。