別スレッドからコントロールを操作する(Invoke)

C#で別スレッドからコントロールを操作したい場合はInvokeを用いると良い事がわかった。基本的に以下のように用いる。

if (control.InvokeRequired) {
    control.Invoke(new delegateの名前(呼びたいメソッド), 引数);
} else {
    呼びたいメソッド(引数);
}

とする。最初の引数がDelegateなのでここでは型指定でnewする必要がある模様。めんどい。でも安全には代えられない。ちなみにInvokeの代わりにBeginInvokeを用いると非同期に実行できる。結果を受け取りたい場合は、BeginInvokeの返値を好きなタイミングでEndInvokeに渡してやれば良い。Debug時はCheckForIllegalCrossThreadCallsは基本的にtrueにしておくと幸せになれそう。