Estoy escribiendo una aplicación de WinForms que tiene dos modos: consola o GUI. Tres proyectos dentro de la misma solución, uno para la aplicación de la consola, uno para los formularios de la interfaz de usuario y el tercero para mantener la lógica de que las dos interfaces también se conectarán. La aplicación de consola funciona sin problemas.Extraños errores de UI de cross-threading
Un modelo que mantiene la facilidad de selecciones, tiene una IList<T>
donde T es un objeto local, Step
, que implementa INotifyPropertyChanged
, así que en la interfaz de usuario este está montado en un DataGridView. Todo está bien en el tiempo de ejecución, el estado inicial de los objetos se refleja en la pantalla.
Cada uno de los objetos Step
es una tarea que se realiza sucesivamente; algunas de las propiedades cambiarán, se reflejarán en IList y se transmitirán a DataGridView.
Esta acción en las versiones de la interfaz de usuario se realiza mediante la creación de un BackgroundWorker que vuelve a generar eventos en la interfaz de usuario. El Step
lo hace y genera un objeto StepResult
que es un tipo enumerado que indica un resultado (por ejemplo, Running, NotRun, OK, NotOK, Caveat) y una cadena para indicar un mensaje (porque el paso se ejecutó pero no del modo esperado, es decir, una advertencia). Normalmente las acciones involucrarán una interacción de base de datos, pero en el modo de depuración, genero aleatoriamente un resultado.
Si el mensaje es nulo, no hay nunca un problema, pero si me generan una respuesta como esta:
StepResult returnvalue = new StepResult(stat, "completed with caveat")
me sale un error que dice que el DataGridView se está accediendo desde un hilo que no sea el hilo se fue creado en. (Estoy pasando esto a través de un controlador personalizado que debe manejar la invocación cuando sea necesario, ¿no es así?)
Luego, si genero una respuesta única, p. utilizando un número aleatorio r
:
StepResult returnvalue = new StepResult(stat, r.ToString());
las acciones tengan éxito sin ningún problema, los números se escriben limpiamente a la DataGridView.
Estoy desconcertado. Supongo que de alguna manera es un problema literal de cadena, pero ¿alguien puede dar una explicación más clara?
No es exactamente la respuesta, ¡pero sí en la línea correcta! – Unsliced
Perfick! Exactamente lo que necesitaba para enlazar a colecciones en una DLL de Winforms y clientes de WPF, gracias. – Wonko
Funciona solo si se creó BindingList en el hilo de la interfaz de usuario, ¿verdad? Pero, ¿hay alguna solución, si BindingList <> se crea fuera del hilo de UI? Y no, no podemos pasar ISynchronizeInvoke o SynchronizationContext correspondiente a BindingList :( –