匿名メソッドの変数キャプチャ
基本的な大事なことです。
Javascriptのクロージャと同じ考え方です。。。
ど忘れしてましたので再確認を兼ねて書き置きします。
//非同期でFriendGridにイメージを追加していく (ダメバージョン) Task.Factory.StartNew(() => { foreach (var friend in ViewModel.Friends) { //ループで一意な変数がキャプチャされるので、全て末尾要素が選択されてしまう。 Dispatcher.BeginInvoke(new Action(() => { FriendGrid.Children.Add(new Image(){DataContext = friend}); }) , System.Windows.Threading.DispatcherPriority.Background, null ); } });
//非同期でFriendGridにイメージを追加していく (OKバージョン) Task.Factory.StartNew(() => { foreach (var friend in ViewModel.Friends) { var f = friend; //ループ内にローカル変数を追加。匿名メソッドがこの変数をキャプチャするようにする。 Dispatcher.BeginInvoke(new Action(() => { FriendGrid.Children.Add(new Image(){DataContext = f}); }) , System.Windows.Threading.DispatcherPriority.Background, null ); } });