myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Zurück   myGully.com > Computer & Technik > Programmierung
Seite neu laden

[C#] Threads in Klassenbibliotheken oder nicht?

Willkommen

myGully

Links

Forum

 
Antwort
Themen-Optionen Ansicht
Ungelesen 09.04.10, 09:15   #1
stan1986
Erfahrener Newbie
 
Registriert seit: Nov 2009
Beiträge: 120
Bedankt: 38
stan1986 ist noch neu hier! | 0 Respekt Punkte
Standard [C#] Threads in Klassenbibliotheken oder nicht?

Hallo

Ich habe eine Grundsatzfrage zum Thema Threading.

Ich habe mir eine Klasse (heisst 'FileDownload') erstellt, mit der eine Datei gedownloadet wird, gewisse Events auslöst usw.
Die Klasse, mit zusätzlich andernen Klassen, soll als Klassenbibliothek kompiliert werden, damit ich die resultierende dll-Datei in anderen Projekten benutzen kann.

Nun zu meiner Frage, bei der ich eigentlich 2 Lösungsvarianten sehe:

Variante 1:
Ich erstelle in der Klasse schon den Thread für einen Download, damit ich mich in späteren Projekten, wo diese Bibliothek verwendet wird, nicht mehr um das Threading (in Bezug auf das Downloaden) kümmern muss. Sondern nur noch das/die Objekte instanziere und die 'Start()'-Methode aufrufe.

Aufruf dann wie folgt:
Code:
FileDownload file1 = new FileDownload();
FileDownload file2 = new FileDownload();

file1.start();
file2.start();
Diese 2 Downloads würden dann ja parallel laufen, da in der FileDownload-Klasse ja ein Thread erstellt wird.

Variante 2:
Oder ich in der Klasse keine Threads erstelle, dafür in späteren Projekten wenn ich die Klasse verwende (bei der Instanzierung des, möglicherweise mehrere, 'FileDownload'-Objektes), diese Threads erstelle.

Aufruf dann wie folgt:
Code:
FileDownload file1 = new FileDownload();
Thread thr1 = new Thread(new ParameterizedThreadStart(download));
thr1.start(file1);

FileDownload file2 = new FileDownload();
Thread thr2 = new Thread(new ParameterizedThreadStart(download));
thr1.start(file2);

private void download(object file)
{
    (FileDownload)file.start();
}


Der Code ist nur schnell hingeschrieben, er soll auch hier auch nicht korrekt sein, sondern nur zur Veranschaulichung dienen.

Es geht um die Grundsatzfrage, was besser ist, in Klassenbibliotheken selbst schon die Threads zu erstellen, oder die Threads im Programm zu erstellen, bei welchem man diese Klassenbibliothek benutzt.

Was ist 'best practice'?

Danke schonmal im vorraus.
stan1986 ist offline   Mit Zitat antworten
Ungelesen 11.04.10, 06:47   #2
stan1986
Erfahrener Newbie
 
Registriert seit: Nov 2009
Beiträge: 120
Bedankt: 38
stan1986 ist noch neu hier! | 0 Respekt Punkte
Standard

*push*
stan1986 ist offline   Mit Zitat antworten
Ungelesen 11.04.10, 14:34   #3
gosha16
Banned
 
Registriert seit: Sep 2009
Ort: /root/
Beiträge: 824
Bedankt: 640
gosha16 ist noch neu hier! | 0 Respekt Punkte
Standard

was spricht denn jetzt genau gegen die threads?
Das würde ich nach Sachlage entscheiden.

Du könntest natürlich auch erstmal alles unthreaded schreiben und dann für die Threads makros anlegen. (wenns sowas in C# gibt?)

Ich persönlich schreibe immer erstmal alles ohne Threads, da kann ich dann in den Programmen selbst, entscheiden an welcher Stelle es Sinnvoll ist Threads zu verwenden.
gosha16 ist offline   Mit Zitat antworten
Ungelesen 06.05.10, 21:04   #4
nooneonearth
Anfänger
 
Registriert seit: Jul 2009
Beiträge: 10
Bedankt: 10
nooneonearth putzt sich die Zähne mit Knoblauch. | 2870 Respekt Punktenooneonearth putzt sich die Zähne mit Knoblauch. | 2870 Respekt Punktenooneonearth putzt sich die Zähne mit Knoblauch. | 2870 Respekt Punktenooneonearth putzt sich die Zähne mit Knoblauch. | 2870 Respekt Punktenooneonearth putzt sich die Zähne mit Knoblauch. | 2870 Respekt Punktenooneonearth putzt sich die Zähne mit Knoblauch. | 2870 Respekt Punktenooneonearth putzt sich die Zähne mit Knoblauch. | 2870 Respekt Punktenooneonearth putzt sich die Zähne mit Knoblauch. | 2870 Respekt Punktenooneonearth putzt sich die Zähne mit Knoblauch. | 2870 Respekt Punktenooneonearth putzt sich die Zähne mit Knoblauch. | 2870 Respekt Punktenooneonearth putzt sich die Zähne mit Knoblauch. | 2870 Respekt Punkte
Standard

Deine Frage beantwortet sich fast schon in ihrer Stellung:
  • Variante 1 benötigt deutlich weniger Code als Variante 2.
  • Variante 1 verbirgt den Thread-Code; wenn es lediglich darum geht, den Download zu starten und bei der Beendigung benachrichtigt zu werden, dann braucht es nicht viel mehr.
  • Bei Variante 2 hat man die Freiheit selbst steuern zu können, ob man den Download synchron oder asynchron ablaufen lassen möchte. Um das zu bewerkstelligen, braucht es wahrscheinlich zusätzlich zum Event noch eine Methode zum Abrufen des Ergebnisses. Allerdings kann auch durch Wegkapseln dieser Details (etwa mit einem Boolean-Parameter async) diese Freiheit gelassen werden.
  • Sollen die Download-Threads explizit gesteuert werden, könnten, bei Realisierung von Variante 1, die entsprechenden zu kapselnden Steuermethoden die Klasse unübersichtlich machen - sie macht zu viel. Im Moment fällt mir dazu jedoch nichts Geeignetes ein. Ich sehe etwa eine Methode zum Abbrechen des Downloads, Events zum Status des Downloads (Fortschritt, Beendet) und eine Methode zum Abrufen der heruntergeladenen Daten. Dabei ist das Abbrechen und die Benachrichtigung ohnehin nur bei asynchronen Konzepten sinnvoll, da in einer single-threaded Anwendung der Hauptthread blockiert wird, bis der Download beendet ist.
  • Am Ende wirst du für deine Klassenbibliothek zwecks effizienter Ressourcenverwaltung (Threads, parallele Downloads) wahrscheinlich darin enden, dass du einen Download-Manager baust, dem du Jobs geben kannst, die er dann abarbeitet und dich bei Beendigung benachrichtigt. Eine Download-Manager-Komponente könnte man dann vielleicht sogar im Designer auf ein Formular ziehen o.Ä.

Schlussendlich macht es wohl Sinn, alles wegzukapseln.

Ich hoffe, das hilft.
Grüße
nooneonearth ist offline   Mit Zitat antworten
Antwort


Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:08 Uhr.


Sitemap

().