У меня есть класс, который будет читать из Excel (C # и .Net 4), и в этом классе у меня есть фоновый работник, который будет загружать данные из Excel, в то время как пользовательский интерфейс может оставаться отзывчивым. У меня такой вопрос: плохо ли иметь фонового работника в классе? Должен ли я создать свой класс без него и использовать фоновый рабочий для работы с этим классом? Я не вижу никаких проблем с созданием своего класса таким образом, но опять же, я новичок, поэтому я решил, что обязательно позабочусь, прежде чем продолжить.
Я надеюсь, что этот вопрос уместен здесь, так как я не думаю, что он должен быть связан со стековым потоком, так как мой код работает, это просто проблема дизайна.
Ответы:
Да, ты должен. И я скажу вам, почему - вы нарушаете принцип единой ответственности . Тесно связывая класс, который обращается к документу Excel, с тем, как он обращается к документу Excel, вы исключаете возможность для кода «контроллера» (любого кода, который его использует) делать это по-другому. Вы можете спросить, насколько они разные? Что если в коде контроллера есть две операции, которые занимают много времени, но хотят, чтобы они были последовательными? Если вы позволили контроллеру обрабатывать потоки, он может одновременно выполнять обе длительные задачи в одном потоке. Что, если вы хотите получить доступ к документу Excel из контекста, не связанного с пользовательским интерфейсом, и не нуждаетесь в нити?
Перекладывая ответственность за многопоточность на вызывающую сторону, вы обеспечиваете большую гибкость кода, делая его более пригодным для повторного использования.
источник
Это хороший дизайн, чтобы операции пользовательского интерфейса работали в отдельном потоке от фоновых задач. В противном случае пользовательский интерфейс перестает отвечать, когда приложение занято.
Если вы можете отделить часть, которая работает в фоновом потоке, с его собственным классом, код будет чище.
источник
Я бы отделил ваш интерфейс от фоновой задачи, используя отдельные классы. Это поощряет разделение интересов. Код пользовательского интерфейса и бизнес-логика не должны смешиваться.
источник
Из того, что я помню о BackgroundWorkers, это то, что они предоставляют ряд удобных методов, таких как возможность отправлять обновления прогресса в пользовательский интерфейс. Нет правила, согласно которому вы не можете использовать его из другого класса.
Также, если вы выполняете итерацию, которая не требует обработки элементов в определенном порядке, рассмотрите возможность использования ThreadPool вместо этого (или если вы используете .NET 4, используйте библиотеку параллельных задач ).
источник