C# InvokeとBeginInvokeの違いは?

はじめに

WPFアプリ作成中にBeginInvokeとInvokeを使い分ける必要があったのでメモる。

 

Dispatcher.BeginInvoke

スレッドでデリゲートを非同期的に実行、 Dispatcher に関連付けられています。

Dipatcher.Invoke

指定したデリゲートをスレッドで同期的に実行、 Dispatcher に関連付けられています。

まとめ

とくにBeginInvokeは非同期のためRace Conditionなど引き起こす可能性があるので注意して使う。バックグラウンドで状態監視してUIを制御するときにBeginInvokeやInvokeを使うことも多いが、処理によってはBeginInvokeを使うと複数回呼ばれてしまうこともあるので注意が必要そう。