Ich habe eine Klasse, die aus Excel (C # und .Net 4) liest, und in dieser Klasse habe ich einen Hintergrund-Worker, der die Daten aus Excel lädt, während die Benutzeroberfläche reagieren kann. Meine Frage lautet wie folgt: Ist es schlechtes Design, einen Hintergrundarbeiter in einer Klasse zu haben? Soll ich meine Klasse ohne sie erstellen und einen Hintergrund-Worker verwenden, um diese Klasse zu bearbeiten? Ich kann keine Probleme damit sehen, meine Klasse auf diese Weise zu erstellen, aber andererseits bin ich ein Neuling, also dachte ich, ich würde sicherstellen, bevor ich weitermache.
Ich hoffe, dass diese Frage hier relevant ist, da ich nicht denke, dass es sich um einen Stackoverflow handeln sollte, da mein Code funktioniert. Dies ist nur ein Designproblem.
quelle
Antworten:
Ja du solltest. Und ich werde Ihnen sagen, warum - Sie gegen das Prinzip der einheitlichen Verantwortung verstoßen . Durch die enge Kopplung der Klasse , die die Excel - doc greift mit , wie es greift auf die Excel - doc, beseitigen Sie die Möglichkeit , für die „Controller“ Code (Code, der verwendet diese) ist es eine andere Art und Weise zu tun. Wie anders, könnten Sie fragen? Was ist, wenn der Controller-Code zwei Operationen enthält, die lange dauern, aber sequentiell ausgeführt werden sollen? Wenn Sie dem Controller die Möglichkeit gegeben haben, das Threading zu verarbeiten, kann er beide Aufgaben mit langer Laufzeit in einem Thread gleichzeitig ausführen. Was ist, wenn Sie aus einem Nicht-UI-Kontext auf das Excel-Dokument zugreifen möchten und es nicht als Thread ausgeführt werden muss?
Indem Sie die Verantwortung für die Weiterleitung an den Anrufer übertragen, können Sie den Code flexibler und wiederverwendbarer gestalten.
quelle
Es ist ein gutes Design, wenn UI-Vorgänge in einem von Hintergrundaufgaben getrennten Thread ausgeführt werden. Andernfalls reagiert die Benutzeroberfläche nicht mehr, wenn die Anwendung ausgelastet ist.
Wenn Sie den Teil, der im Hintergrund-Thread funktioniert, in eine eigene Klasse unterteilen können, wird der Code sauberer.
quelle
Ich würde Ihre Benutzeroberfläche mit separaten Klassen von Ihrer Hintergrundaufgabe trennen. Dies fördert die Trennung von Bedenken. UI-Code und Geschäftslogik sollten nicht gemischt werden.
quelle
Was ich an BackgroundWorkers erinnere, ist, dass sie eine Reihe von Convenence-Methoden bereitstellen, beispielsweise die Möglichkeit, Fortschrittsaktualisierungen an die Benutzeroberfläche zu senden. Es gibt jedoch keine Regel, die besagt, dass Sie es nicht aus einer anderen Klasse verwenden können.
Wenn Sie eine Iteration ausführen, bei der keine Elemente in einer bestimmten Reihenfolge verarbeitet werden müssen, sollten Sie stattdessen den ThreadPool verwenden (oder unter .NET 4 die Task Parallel Library verwenden ).
quelle