Pregunta

Supongamos que estoy accediendo a un DataTable desde varios subprocesos. Si quiero acceder a una fila en particular, sospecho que necesito para bloquear esa operación (podría ser confundido por esto, pero al menos sé que de esta manera Estoy seguro):

// this is a strongly-typed table
OrdersRow row = null;
lock (orderTable.Rows.SyncRoot) {
    row = orderTable.FindByOrderId(myOrderId);
}

Pero entonces, si quiero actualización esa fila, debería bloquear la tabla (o más bien, objeto Rows.SyncRoot de la tabla) más , o puedo simplemente cerrar la fila?

¿Fue útil?

Solución

En realidad, simplemente realizando una lock en un solo lugar en el DataTable o DataRow no lo hace realidad lo nada. Un aspecto importante a recordar en el uso de bloqueos Monitor (que es lo que es un bloque lock) es que un objeto de bloqueo no hace nada a ella; Esa es una razón por la que algunos abogan por el uso de bloqueo dedicada objetos en lugar de bloquear el recurso en sí mismo, ya que le obliga a darse cuenta de que tiene que realizar el bloqueo (y en el mismo objeto) cada vez que usted está tratando con el recurso.

Una vez dicho esto, es una mejor idea para bloquear toda la DataTable, como el propio almacenamiento de datos está ahí (objetos del DataRow internamente sólo contienen un desplazamiento en el DataTable cuanto a dónde recuperar los datos). Debido a esto, incluso si sincroniza el acceso a filas individuales, la actualización de dos diferente filas al mismo tiempo hará que usted ponga al día el mismo mecanismo de almacenamiento de datos de una manera no sincronizada.

Hay un conflicto aquí entre la visualización de tipos internos como un "recuadro negro" y el bloqueo sólo lo que necesita (que, en este caso, que llevaría a una conclusión errónea de sólo el bloqueo de la fila) y tratando de comprender mejor el funcionamiento interno del tipo y depender de los detalles de implementación que podrían cambiar .

El resultado es que, en este momento, debe bloquear toda la DataTable para evitar la actualización del sistema de almacenamiento de datos internos de una manera no sincronizada .

Otros consejos

que no es necesario para el bloqueo lee - sólo para escrituras / actualizaciones. bloquear la cantidad más pequeña que se puede, para asegurar la consistencia de los datos ... por lo general sólo la fila que está actualizando. si está actualizando padre / hijo relaciones entre tablas, que necesita para bloquear cada fila de cada tabla.

La tabla de datos sólo es seguro para subprocesos múltiples operaciones de lectura:

http://msdn.microsoft.com/en -us / biblioteca / system.data.datatable.aspx

http: / /social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/11b69e1a-ad6c-48d5-8e14-264af5b0692e

En la lectura de la tabla de datos existe información contradictoria en relación con la capacidad de bloquear la mesa y le permitirá actualizar los datos de forma segura en una fila. De acuerdo con el segundo enlace se puede bloquear la tabla y actualizar la fila. Siendo esto es de una MS MVP, yo diría que es probable que pueda bloquear la tabla y estar bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top