diff --git a/client/src/GHC/Debug/ParTrace.hs b/client/src/GHC/Debug/ParTrace.hs
index ca3cbb6bbcb4a3eb6f46f7778e106f99494eb4f5..d92de3f2e57f208743e00c0e633d40ec0763d436 100644
--- a/client/src/GHC/Debug/ParTrace.hs
+++ b/client/src/GHC/Debug/ParTrace.hs
@@ -266,8 +266,9 @@ traceParFromM k cps = do
       go  = sendToChan (TraceState ts_map)
   as <- sequence (map ($ go) start )
   mapM_ go cps
-  unsafeLiftIO $ waitFinish work_actives
-  unsafeLiftIO $ mapM_ cancel as
+  wait_finish <- unsafeLiftIO $ async (waitFinish work_actives)
+  unsafeLiftIO $ waitAny $ (() <$ wait_finish) : (map ((<$) ()) as)
+  unsafeLiftIO $ mconcat <$> mapM cancel as
   unsafeLiftIO $ mconcat <$> mapM wait as
 
 waitFinish :: [STM Bool] -> IO ()