Tengo una clase que leerá de Excel (C # y .Net 4) y en esa clase tengo un trabajador en segundo plano que cargará los datos de Excel mientras la interfaz de usuario puede seguir respondiendo. Mi pregunta es la siguiente: ¿Es un mal diseño tener un trabajador de fondo en una clase? ¿Debo crear mi clase sin ella y usar un trabajador en segundo plano para operar en esa clase? Realmente no puedo ver ningún problema de crear mi clase de esta manera, pero de nuevo soy un novato, así que pensé que me aseguraría antes de continuar.
Espero que esta pregunta sea relevante aquí, ya que no creo que deba estar en stackoverflow ya que mi código funciona, esto es solo un problema de diseño.
c#
design
multithreading
class-design
Jetti
fuente
fuente
Respuestas:
Si deberías. Y le diré por qué: está violando el Principio de responsabilidad única . Al acoplar firmemente la clase que accede al documento de Excel con la forma en que accede al documento de Excel, elimina la posibilidad de que el código del "controlador" (cualquier código que use esto) lo haga de una manera diferente. ¿Qué tan diferente, puedes preguntar? ¿Qué sucede si el código del controlador tiene dos operaciones que toman mucho tiempo pero quieren que sean secuenciales? Si le permitiste al controlador la capacidad de manejar el subproceso, puede realizar ambas tareas de ejecución prolongada juntas en un subproceso. ¿Qué sucede si desea acceder al documento de Excel desde un contexto que no es de interfaz de usuario y no necesita que se enhebre?
Al trasladar la responsabilidad de enhebrar a la persona que llama, permite una mayor flexibilidad de su código, haciéndolo más reutilizable.
fuente
Es un buen diseño que las operaciones de la interfaz de usuario operen en un hilo separado de las tareas en segundo plano. De lo contrario, la interfaz de usuario deja de responder cuando la aplicación está ocupada.
Si puede separar la parte que funciona en el subproceso de fondo a su propia clase, el código será más limpio.
fuente
Separaría tu IU de tu tarea en segundo plano usando clases separadas. Hacerlo alienta la separación de las preocupaciones. El código de interfaz de usuario y la lógica empresarial no deben mezclarse.
fuente
De lo que recuerdo sobre BackgroundWorkers es que proporcionan una serie de métodos de conveniencia, como la capacidad de enviar actualizaciones de progreso a la interfaz de usuario. Sin embargo, no hay una regla que diga que no puedes usarlo desde una clase diferente.
Además, si está haciendo una iteración que no requiere que los elementos se procesen en un orden específico, considere usar ThreadPool en su lugar (o si está en .NET 4 use la Biblioteca de tareas paralelas ).
fuente