2010-02-15 32 views
5

¿Cuál es el mejor patrón para hacer que los conjuntos de datos sean seguros para la escritura?Haciendo seguro el hilo de conjuntos de datos en C#

Lo mejor que puedo encontrar al googlear es 'implementar una capa de envoltura con cerraduras' pero a primera vista esto parece bastante desordenado.

¿Alguien puede recomendar/señalarme una buena solución para esto? Parece probable que sea un problema que ya ha sido resuelto en alguna parte.

editar: También necesito vincular el conjunto de datos a una cuadrícula ui, lo que complica algo las cosas.

+0

lo siento, ¡los conjuntos de datos son complicados! –

Respuesta

3

"Implementar una capa de envoltura con cerraduras" es el camino a seguir.

Es probable que la capa contenedora use el bloqueo que es específico de la forma en que su aplicación usa los DataSets.

Intentar diseñar una solución genérica para una clase tan compleja como un DataSet probablemente esté condenada al fracaso.

Por ejemplo, enumerar propiedades generalmente no será seguro para subprocesos, por lo que necesitaría mantener un bloqueo mientras cualquier llamador enumere cualquiera de las muchas propiedades de colección (DataSet.Tables, DataTable.Rows, ... .).

1

Realmente depende, enormemente, de los datos en cuestión.

Si se trata de valores enteros o de tipo de referencia, el Interlocked class puede ser superior a tomar bloqueos. De lo contrario, una sincronización exitosa normalmente significa crear un bloqueo interno en la clase.

La otra alternativa, sin embargo, es hacer que sus conjuntos de datos principales funcionen en tipos inmutables. A continuación, puede trabajar en copias en subprocesos individuales y solo proporcionar sincronización en el punto de sustitución de valores dentro del conjunto principal de datos. Esto evita bloqueos en las copias individuales por hilo.

1

Implementar una capa de envoltura con bloqueos. Seriamente. No puede subclasificar los métodos importantes, por lo que, siempre que estén disponibles, la seguridad de su hilo se puede romper.

Bueno, también puede implementar un conjunto de métodos de extensión seguros para subprocesos y seguirlos, pero eso solo funcionará si no tiene que pasar el DataSet a una biblioteca de terceros que accederá directamente a él.