引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
2.2 GUIと非同期処理
グラフィックスのように、OSやハードウェアへの依存が強い部分は、往々にして単一スレッドでしか動作できないようになっています。この例のボタンの状態の変更も例外ではなく、UIスレッドの中で行う必要があります。
private void Button_Click(object sender, RoutedEventArgs e)
{
this.OkButton.IsEnabled = false;
this.Cursor = Cursors.Wait;
Task.Factory.StartNew(() =>
{
System.Threading.Thread.Sleep(3000);
MessageBox.Show("処理完了");
}).ContinueWith(t =>
{
// UIスレッドで実行
this.OkButton.IsEnabled = true;
this.Cursor = Cursors.Arrow;
},
TaskScheduler.FromCurrentSynchronizationContext());
}
Unityにおいては、スレッド内でuGUIの変更処理はできず、OnGUIなどで処理しないといけない。
C++ Builderにおいても、TThreadからGUI(フォーム)関連の変更をする場合には Synchronize(関数)の形を使わないといけない。
GUI変更を色々なスレッドから直接されると対応が難しいのだろう。