На самом деле, просто выполнение lock
в одном месте в DataTable или DataRow фактически не делает ничего. При использовании Monitor
блокировок (что и является блоком lock
) важно помнить, что блокировка объекта ничего с ним не делает; это одна из причин, по которой некоторые рекомендуют использовать выделенные блокирующие объекты, а не блокировать сам ресурс, поскольку это заставляет вас осознать, что вы должны выполнять блокировку (и для того же объекта) всякий раз, когда вы имеете дело с ресурсом.
При этом лучше заблокировать все DataTable
, так как там находится само хранилище данных (объекты DataRow
внутри содержат только смещение в DataTable
относительно того, где получить данные) , По этой причине, даже если вы синхронизируете доступ к отдельным строкам, одновременное обновление двух разных строк приведет к несинхронизированному обновлению одного и того же механизма хранения данных.
Здесь возникает конфликт между просмотром внутренних типов как «черным ящиком» и блокировкой только того, что вам нужно (что в данном случае приведет к ошибочному выводу о блокировке только строки) и попыткой понять внутренняя работа типа и опора на детали реализации , которые могут измениться .
В результате прямо сейчас вы должны заблокировать все DataTable
, чтобы избежать несинхронизированного обновления внутренней системы хранения данных .