У меня есть фрагмент кода в коде Silverlight, который выглядит примерно так:
foreach (MapLocation loc in e.Result)
{
testDict[loc.ElemId] = loc.ToString();
this.Dispatcher.BeginInvoke(delegate()
{
Image icon = new Image();
icon.SetValue(Image.SourceProperty, nurseIconSource);
Canvas.SetLeft(icon, (double)loc.X * MAP_SCALE);
Canvas.SetTop(icon, MAP_HEIGHT - (double)loc.Y * MAP_SCALE);
icons[loc.ElemId] = icon;
MainCanvas.Children.Add(icon);
});
}
}
Этот цикл выполняется 25 раз в потоке, отдельном от потока пользовательского интерфейса. Объект testDict заканчивается всеми 25 записями после выполнения метода, в то время как словарь значков хранит запись только для 25-го (последнего) элемента.
Я впервые использую Dispatcher. Разве это не должно называться быстрым огнем, как это? Все, о чем я могу думать, это то, что первый раз, когда делегат вызывается, происходит после последнего выполнения цикла, поэтому объект loc всегда один и тот же элемент. Это точно?