¿Cómo dar retroalimentación a una interfaz visual, desde una llamada dll?

Descripción general de la arquitectura:

Idioma: C# Windows Form Project usando Class Libraries para ejecutar las tareas del rastreador

Actualmente estoy escribiendo una interfaz (IU) que se usará para "depurar" un rastreador (o un conjunto de rastreadores) que escribí. Cada rastreador es un .dll

Desde la interfaz, voy a invocar los .dlls y no quiero tener que esperar a que finalicen sus tareas (Rastrear, analizar y construir las listas de elementos internamente) para mostrar los resultados en la interfaz.

Pregunta:

¿Hay alguna forma en que pueda, de alguna manera, enviar un comentario desde el .dll a la interfaz?

¿Tal vez una barra de progreso, o después de leer los elementos, mostrarlos en la interfaz, antes de rastrear el siguiente elemento?

Lo que quiero es que se muestre algo así en la interfaz (vista de cuadrícula o algo así), en tiempo real.

Finished Crawling College X
Finished Crawling College Y
Problem Crawling College Z - ABORTING
Finished Crawling College K

y así sucesivamente.

¿Cuál es una buena manera de hacerlo?

Pensé en enviar la referencia del Componente Visual al .dll (oa un .dll secundario) para que actualice el componente visual en sí, en medio de la ejecución. ¿Hay algún inconveniente en hacerlo? ¿Rompo alguna buena práctica al hacerlo?

Gracias por adelantado,

Marcello.

preguntado el 11 de junio de 12 a las 19:06

¿Así que estas son clases que escribiste? ¿Por qué no simplemente crear un tipo conocido para todas sus DLL (como una interfaz que exponga los métodos de progreso) y luego interactuar con las clases DLL en ejecución desde la interfaz? -

¿A qué te refieres con los métodos de exposición del progreso? ¿Está hablando de una clase que es visible tanto para los rastreadores como para la interfaz de usuario, que seguirá actualizando la interfaz de usuario después de cada paso del rastreador? ¿Como un "jugador de medio campo"? -

¿Cómo estás ejecutando tus rastreadores? -

@MalcolmO'Hare Cada Crawler es un .dll y solo llamo a un Método de cada .dll (que es una especie de método principal), llamado StartCrawling(). Después de invocar este método, hará todo, llamando a métodos secundarios, para realizar las solicitudes de páginas html, analizar las páginas y construir las listas de elementos en la memoria. No se utiliza ningún trabajador de fondo o subproceso. Espero que te ayude a entender mi arquitectura -

Entonces, ¿está llamando a su rastreador de forma síncrona y bloqueando la interfaz de usuario mientras se está ejecutando? -

2 Respuestas

Básicamente, podrías hacer algo como esto:

 public interface ICrawler
 {
     void StartCrawling(Action<SomeCrawlingMessageType> callback);
 }

Y tenga alguna clase en su DLL que implemente esto. Luego pasa una devolución de llamada que su clase de rastreador puede invocar para enviar mensajes al invocador.

En su devolución de llamada, puede tomar los datos que se le pasaron y actualizar la interfaz de usuario invocando las actualizaciones de la interfaz de usuario de forma asincrónica, incluso desde varios rastreadores.

Respondido el 11 de junio de 12 a las 19:06

¿Cómo se llama esto que estás usando? Quiero decir, ¿qué debo cuidar para hacerlo? ¿Devolución de llamada de acción C#? - Marcello Grechi Lins

Action es simplemente un tipo de delegado genérico: puede usar cualquier tipo de delegado que desee devolver los mensajes. En la implementación real, simplemente invocaría la devolución de llamada cada vez que quisiera enviar un mensaje. - Tejas

Estoy tratando de hacerlo. Solo otra pregunta: mi interfaz de usuario llama a un .dll que llama a métodos secundarios en clases secundarias. La última "capa" de clases es a quien quiero enviar el mensaje. ¿Puedo escribir la devolución de llamada allí y la otra parte en la interfaz de usuario o necesito enviar la llamada de vuelta a cada capa para que llegue a la que tiene la interfaz de usuario? - Marcello Grechi Lins

Parece que su interfaz de usuario no tiene visibilidad de las partes internas de la DLL, por lo que deberá pasar la devolución de llamada a todas las capas de cada cosa según corresponda. - Tejas

¿Qué hay de crear eventos en cada uno de sus dlls de rastreador, luego en su interfaz de usuario principal, suscríbase a cada uno de esos eventos e informe/muestre los resultados?

Respondido el 11 de junio de 12 a las 19:06

¿Quiere decir declarar mis propios eventos y dispararlos después de cada paso del rastreador? Si mi subproceso principal (ui) está escuchando los eventos, ¿los manejará sin bloquear los .dlls? ¿Hay alguna referencia que me puedas dar? - Marcello Grechi Lins

Podrías considerar revisar el tutorial de MSDN en este. No estoy 100% convencido de que esta sea la solución, pero es muy probable que lo sea y, de todos modos, deberías saber cómo funcionan los eventos. - tmesser

@MarcelloGrechiLins sí, crea tus propios eventos. La interfaz de usuario debería poder manejar esos eventos sin problemas. Consulte el enlace YYY para eventos de MSDN. Además, si aún necesita hacer cosas en la interfaz de usuario mientras el dll se rastrea, inicie el proceso a través de un BackgroundWorker o en un subproceso separado... de esa manera, la interfaz de usuario sigue respondiendo mientras el rastreador hace el trabajo. - mira

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.