Mam klasę, która będzie czytać z Excela (C # i .Net 4), aw tej klasie mam proces roboczy w tle, który załaduje dane z Excela, podczas gdy interfejs użytkownika może pozostać responsywny. Moje pytanie brzmi: czy źle jest mieć pracownika pracującego w tle w klasie? Czy powinienem utworzyć swoją klasę bez niej i użyć pracownika działającego w tle do działania na tej klasie? Nie widzę żadnych problemów z tworzeniem mojej klasy w ten sposób, ale z drugiej strony jestem nowicjuszem, więc pomyślałem, że upewnię się, zanim będę kontynuować.
Mam nadzieję, że to pytanie jest istotne tutaj, ponieważ nie sądzę, że powinno to dotyczyć przepływu stosu, ponieważ mój kod działa, to tylko kwestia projektu.
c#
design
multithreading
class-design
Jetti
źródło
źródło
Odpowiedzi:
Tak, powinieneś. I powiem ci, dlaczego - naruszasz zasadę pojedynczej odpowiedzialności . Poprzez ścisłe powiązanie klasy, która uzyskuje dostęp do dokumentu programu Excel, z tym, w jaki sposób uzyskuje on dostęp do dokumentu programu Excel, eliminuje się zdolność kodu „kontrolera” (dowolnego kodu, który tego używa), aby zrobić to w inny sposób. Jak inaczej możesz zapytać? Co jeśli kod kontrolera ma dwie operacje, które zajmują dużo czasu, ale chcą, aby były sekwencyjne? Jeśli zezwoliłeś kontrolerowi na obsługę wątków, może on wykonywać oba długoterminowe zadania razem w jednym wątku. Co zrobić, jeśli chcesz uzyskać dostęp do dokumentu programu Excel z kontekstu innego niż interfejs użytkownika i nie potrzebujesz wątku?
Przenosząc odpowiedzialność za wysyłanie wątków na osobę wywołującą, zapewniasz większą elastyczność kodu, dzięki czemu jest on łatwiejszy do ponownego wykorzystania.
źródło
Dobrze jest projektować operacje interfejsu użytkownika w oddzielnym wątku od zadań w tle. W przeciwnym razie interfejs użytkownika przestanie odpowiadać, gdy aplikacja będzie zajęta.
Jeśli możesz oddzielić część działającą w wątku tła od własnej klasy, kod będzie czystszy.
źródło
Oddzieliłbym twój interfejs od zadania w tle, używając oddzielnych klas. Takie postępowanie zachęca do rozdzielenia obaw. Kod interfejsu użytkownika i logika biznesowa nie powinny być mieszane.
źródło
Z tego, co pamiętam w BackgroundWorkers, jest to, że zapewniają one szereg metod konwergencji, takich jak możliwość wysyłania aktualizacji postępu do interfejsu użytkownika. Nie ma jednak reguły, która mówi, że nie możesz jej używać z innej klasy.
Również jeśli wykonujesz iterację, która nie wymaga przetwarzania elementów w określonej kolejności, rozważ użycie zamiast tego ThreadPool (lub jeśli korzystasz z .NET 4, użyj biblioteki zadań równoległych ).
źródło