«Состояние гонки» может быть не лучшим способом решить проблему с первым фрагментом. Но в основном вы используете захваченную переменную вне области захвата. Значение "item" в конечном итоге будет last item , тогда будет вызван ваш метод foo
для всех элементов.
Вместо этого сделайте следующее:
foreach(var item in list)
{
var tmpItem = item;
Deployment.Current.Dispatcher.BeginInvoke( () => foo(tmpItem));
}
Это помещает переменную в более низкую область, и она захватывается в этой области. Это гарантирует, что каждое значение будет перехвачено и отправлено на foo
.
Вторая версия почти наверняка является ошибкой, учитывая здравый смысл переменной list
.