デリゲートの BeginInvoke で作るのは、Thread じゃなくて ThreadPool なのよね。
プライオリティ設定とか Abort、Suspend はできなかったと思う。

EndInvoke は、スレッド強制終了じゃなくて、
Fork / Join の Join 相当。

あと、エンドボタンを押したときに例外が出るのは、
EndInvoke を呼んだこと自体のせいじゃなくて、
BeginInvoke したスレッドと違うスレッドで EndInvoke されたからかも。

ちなみに、Thread であっても、Abort 呼ぶのは非推奨になってたはず。
volatile なフラグでも用意しといて、
while (flag)
{
  hoge();
}
としろって。