2010-02-24 15 views
7

Estoy escribiendo una aplicación de catalogación que analiza y extrae información de los archivos y almacena la información de cada archivo en una instancia de objeto. Además de los datos extraídos del archivo, los objetos también tienen propiedades de metadatos adicionales (autor, etiquetas, notas, etc.) que luego se almacenan en un archivo XML separado.¿Es seguro permitir que dos subprocesos editen diferentes propiedades del mismo objeto al mismo tiempo?

Extraer los datos de los archivos es un proceso lento, así que lo tengo en ejecución en un hilo separado. Las propiedades extraídas de los archivos solo se obtendrán de los archivos y, por lo tanto, tendrán los atributos [Solo lectura] para evitar que el usuario los edite. Las propiedades de metadatos, por otro lado, solo las llena el usuario y, por lo tanto, no son de solo lectura. Permitiré al usuario ver/editar estos objetos a través de un PropertyGrid.

Entonces, si el proceso de extracción se ejecuta en un subproceso que rellena las propiedades de archivo de un objeto, ¿hay algún peligro al permitir que el usuario edite las propiedades de metadatos al mismo tiempo? Estoy tratando de decidir si debo usar una interfaz modal que evite que el usuario haga algo hasta que se complete/cancele la extracción, o una interfaz no modal que les permita seguir trabajando mientras se ejecuta la extracción.

Respuesta

3

Para ser específico a su pregunta: No, no hay ningún problema.

Lo que debe tener en cuenta es que las propiedades escritas por el hilo de fondo no se leen desde el hilo de la interfaz de usuario mientras se escriben. Si no puede garantizar esto, debe usar bloqueos, ordenar la escritura en el hilo de la interfaz de usuario. (Usando control.Invoke() o BackgroundWorker o, asegúrese de que la escritura es una escritura atómica del puntero a un objeto que no está editado por el hilo de fondo mientras visible desde el hilo de interfaz de usuario. Yo no asumiría contenedores estándar como List<T> es seguro para subprocesos.

[texto cambiado]

+0

Así que si el hilo de extracción actualizó las propiedades del objeto que el usuario estaba viendo actualmente en el propertygrid no se actualizaría hasta que el usuario volviera a seleccionar el objeto en la cuadrícula de la propiedad? No tendría un problema con esto. Estoy más preocupado por el programa de bloqueo, o datos corruptos. Todos los pro perties son tipos primitivos como bool, int, double y string. –

+0

Lo estoy planteando debido a bloqueos potenciales, pero se aplica principalmente a tipos más complejos.En realidad, no se garantiza que un 'doble' se escriba atómico, por lo que podría mostrarse incorrecto si las lecturas y escrituras coinciden. Consulte la precaución en: http://msdn.microsoft.com/en-us/library/system.double.aspx –

+0

Supongo que es muy poco probable que un usuario pueda seleccionar un objeto exactamente al mismo tiempo que se escriben las propiedades. Incluso si lo hicieran, ¿no afectaría la forma en que se escribe el valor correcto? Si el usuario fue de alguna manera muy desafortunado y terminó viendo un valor doble medio escrito. ¿No verían simplemente el valor correcto la próxima vez que seleccionen el objeto? Como solo estoy mostrando los valores en lugar de depender de ellos para otra lógica en el programa, no parece que los bloqueos sean esenciales. –

1

En general, si las propiedades no hacen referencia al estado compartido, entonces pueden actualizarse en subprocesos separados sin problemas, incluso si son parte del mismo objeto.

0

Tiene libertad de hacerlo, solo si está seguro de que el cambio de una propiedad no causa el cambio de la otra que se puede cambiar en otra secuencia. En breve, si las propiedades no tienen datos compartidos, ¡funcionarán de maravilla! .

1

Suponiendo propiedades "normales" - por ejemplo, auto-aplicado o simples campo respaldado:

public class MyClass { 
    [ReadOnly] 
    public string FileAuthor { get; set; } 

    public string MetaDataAuthor { 
     get { return _metaDataAuthor; } 
     set { _metaDataAuthor = value; } 
    } 
    private string _metaDataAuthor; 
} 

no debería haber cualquier problema relacionado con el cambio de los valores en los diferentes hilos. No es necesario sincronizar la escritura con diferentes variables.

Sin embargo - si el PropertyGrid está mostrando las propiedades del archivo (como FileAuthor) - lo que probablemente desea sincronizar la lectura (la unión del PropertyGrid) y escritura (el extracto de archivos) de aquellos.

+0

No todas las propiedades son propiedades "normales" de los tipos primitivos –

Cuestiones relacionadas