textboxを一つ持ったForm2クラスと、整数を1から素数判定していくPrimeクラスが有って、
PrimeクラスはForm2クラスを所有して、publicなstartCalc、privateなCalcメソッドを持っています。
Form2クラスは自身のtextboxに文字を追記するpublicなwritelnメソッドを持っています。

希望の挙動は、PrimeクラスのstartCalcを呼ぶと、
メソッド内部でForm2が生成され、Calcメソッドの中で無限ループしつつ、逐一Form2.writelnに結果を書きだす事です。

こんなプログラムを書きたいのですが、startCalcの中で、form2.ShowDialog();Calc();とするとForm2を閉じるまでCalcが行われませんし、
form2.Show();Calc();とすると、ウィンドウメッセージの処理を忘れた時のような状態でフリーズしました。

そこで、並列にすれば良いのかな?と思って、
System.Threading.Tasks.Parallel.Invoke(form2.Show,Calc);としてみましたが、これもフリーズし、
最終的にSystem.Threading.Tasks.Parallel.Invoke(wrapper,Calc);としてwrapperの中でform2.ShowDialogすると希望通りの挙動になりました。
気になったのでwrapperの中でform2.Show()してみたら、これはフリーズしました。

結果として動いたのは嬉しいんですが、ここまで違いが出た理由が全く分からなくて気持ち悪いです。
誰か説明して頂けないでしょうか?