BackgroundWorkerって使い物になる?

というのは、画面にボタンとプログレスバー、リストビューを置いて、
ボタンクリック時にRunWorkerAsyncを呼び出して、
DoWorkイベントでループで0〜10000まで回して、
ループの中で別の自分で作った関数を呼び出して(引数にはBackgroundWorkerとDoWorkEventArgs)
そこで、GUIの更新(リストビューにアイテムを追加)して、ReportProgressを呼び出す。
そして、ProgressChangedイベントでプログレスバーの値をカウントアップ。

思いっきり、メインのGUIの操作(画面の更新)が出来なくて固まったようになるんだが・・・

確かにプログレスバーはちゃんと更新されるが、他の操作が出来ない。
キャンセルボタン置いても、イベントが発生しないから止まりゃしない。