Eu tenho uma classe que lerá do Excel (C # e .Net 4) e nessa classe eu tenho um trabalhador em segundo plano que carregará os dados do Excel enquanto a interface do usuário permanecer responsiva. Minha pergunta é a seguinte: É um design ruim ter um trabalhador em segundo plano em uma classe? Devo criar minha classe sem ela e usar um trabalhador em segundo plano para operar nessa classe? Não vejo realmente nenhum problema em criar minha turma dessa maneira, mas, novamente, sou novato, então pensei em me certificar antes de continuar.
Espero que essa questão seja relevante aqui, pois não acho que deva estar no stackoverflow, pois meu código funciona, isso é apenas uma questão de design.
c#
design
multithreading
class-design
Jetti
fonte
fonte
Respostas:
Sim você deveria. E eu lhe direi o porquê - você está violando o Princípio da Responsabilidade Única . Ao acoplar firmemente a classe que acessa o documento do Excel com a forma como ele acessa o documento do Excel, você elimina a capacidade do código do "controlador" (qualquer código que use isso) de fazê-lo de maneira diferente. Quão diferente, você pode perguntar? E se o código do controlador tiver duas operações que demoram muito tempo, mas quer que sejam sequenciais? Se você tiver permitido ao controlador lidar com o encadeamento, ele poderá executar as duas tarefas de longa duração juntas em um único encadeamento. E se você deseja acessar o documento do Excel a partir de um contexto que não seja da interface do usuário e não precisa ser encadeado?
Ao passar a responsabilidade de passar para o chamador, você permite maior flexibilidade do seu código, tornando-o mais reutilizável.
fonte
É bom design para que as operações da interface do usuário operem em um thread separado das tarefas em segundo plano. Caso contrário, a interface do usuário não responderá quando o aplicativo estiver ocupado.
Se você pode separar a parte que funciona no encadeamento em segundo plano em sua própria classe, o código será mais limpo.
fonte
Eu separaria sua interface do usuário da sua tarefa em segundo plano usando classes separadas. Isso encoraja a separação de preocupações. O código da interface do usuário e a lógica de negócios não devem ser misturados.
fonte
Pelo que me lembro sobre os BackgroundWorkers, eles fornecem vários métodos de conveniência, como a capacidade de enviar atualizações de progresso para a interface do usuário. Não existe uma regra que diga que você não pode usá-lo de uma classe diferente.
Além disso, se você estiver fazendo uma iteração que não exige que os itens sejam processados em uma ordem específica, considere usar o ThreadPool (ou se estiver no .NET 4, use a Biblioteca Paralela de Tarefas ).
fonte