Laden...

Sinnvolles Threading: An welchen Stellen soll man Threading einsetzen?

Erstellt von blackdynamic vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.009 Views
Thema geschlossen
B
blackdynamic Themenstarter:in
51 Beiträge seit 2010
vor 13 Jahren
Sinnvolles Threading: An welchen Stellen soll man Threading einsetzen?

Hallo Community,

ich bin dabei eine Anwendung zu entwickeln die viel zeitgleich arbeiten muss. Könnt ihr mir sagen, wie ich heraus finde an welchen Stellen einer Anwendung Threading Sinn machen würde bzw wo es erfahrungsgemäß am effektivsten ist? Habe u.a im Moment das Problem, dass meine Anwendung hin und wieder stark hängt wenn sie viel Input aufeinmal verarbeiten muss. Die Anwendung basiert nicht auf dem MVVM Pattern, weil ich zZ. noch kein gut erklärtes Tutorial dazu gefunden habe.

Und könnt ihr mir sagen welche Threading Variante am effektivsten und "saubersten" ist?
Es gibt ja mehrere Varianten des Threadings.

Viele Grüße
blacki

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo blackdynamic,

suchst du vielleicht sowas wie einen BackgroundWorker? Ansonsten noch [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke).

zero_x

B
blackdynamic Themenstarter:in
51 Beiträge seit 2010
vor 13 Jahren

Sorry aber ich meinte eher wo es Erfahrungsgemäß Sinn macht Threading ein zu setzen also wann es an welchen Stellen am effektivsten ist.

Ist der Backgroundworker "sauberer" als die normale Thread Klasse oder als das Invoken von Delegates?

1.044 Beiträge seit 2008
vor 13 Jahren

Hallo blackdynamic,

im Grunde machen beide das Gleiche. Ich würde an deiner Stelle den BackgroundWorker verwenden. Das Thema mit dem "sauberer" ist eine Sache für sich. Wenn der BackgroundWorker für deine Zwecke passt, dann verwende ihn.

zero_x

C
401 Beiträge seit 2007
vor 13 Jahren

Nicht ganz. Der BackgroundWorker verwendet einen Thread aus dem ThreadPool, die Thread Klasse hingegen nicht.

Threading macht überall da Sinn, wo du eine aufwändige Aufgabe erledigen willst, aber das Programm trotzdem weiterhin auf eingaben reagieren soll. Oder eben da, wo du Aufgaben parallel ausführen kannst.

B
blackdynamic Themenstarter:in
51 Beiträge seit 2010
vor 13 Jahren

Wo ist denn der Unterschied ob ein Thread aus dem Threadpool verwendet wird oder nicht?

Kann man irgendwie messen welche Aufgaben aufwändig sind? Kenne mich damit noch nicht so gut aus ...

U
282 Beiträge seit 2008
vor 13 Jahren

Hallo!

Mittels Profiler kannst du rausbekommen, wo dein Programm viel Zeit verbraucht. Aber es ist nicht immer klar, dass man das auch vernünftig parallelisieren kann.

Ich meine wenn du sagst "lade Daten" und das dauert, dann blockiert momentan deine GUI Wenn du das nun parallelisierst blockiert sie nicht, aber früher sind die Daten dennoch nicht da.

Also Threading kann sinnvoll sein, aber es ist auch sehr komplex. Du holst dir, wenn du es das erste mal machst, vermutlich einige schwer zu findende Fehler. Man parallelsisiert eine Anwendung nicht mal gerade so.

Viele Grüße,
Uwe

3.430 Beiträge seit 2007
vor 13 Jahren

Wo ist denn der Unterschied ob ein Thread aus dem Threadpool verwendet wird oder nicht?

Im Threadpool liegen schon Threads die darauf warten verwendet zu werden.
D.h. wenn man einen braucht muss man den Thread nicht erst erstellen.

Einen Thread zu erstellen ist aufwändig, und gerade wenn man viele hat macht es schon einen unterschied wenn man den Pool verwendet

Messen braucht man da imho nix.
Alle Vorgänge die unter bestimmten Umständen länger als 1 Sek dauern, sollten meiner Meinung ausgelagert werden (sofern es sich nicht um die GUI handelt)
Dazu gehören Datenbankzugriffe, aufwändige Berechnungen, alles was einen Timeout auslösen kann und somit den Thread für X Sekunden blockiert....

Gruss
Michael

3.971 Beiträge seit 2006
vor 13 Jahren

Multithreading macht nur sinn, wenn du Aufgaben hast, die (fast) unabhängig von einander ausgeführt werden können. Multithreading lässt sich am besten bei klassichen EVA (Eingabe, Verarbeitung, Ausgabe)-Gebieten einsetzen.

Hast du viele Abhängigkeiten zwischen den Aufgaben, dann das Aufteilen bzw. die Synchronisation von mehreren Threads recht schwierig

Meist gut lassen sich beispielsweise foreach Schleifen parallisieren (aber auch nur, wenn die Einträge nicht untereinander abhängig sind). Dafür gibts mit Parallel.For in .NET 4 auch fertige Implementierungen.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

B
blackdynamic Themenstarter:in
51 Beiträge seit 2010
vor 13 Jahren

Hallo!

Mittels Profiler kannst du rausbekommen, wo dein Programm viel Zeit verbraucht.

Wie benutze ich so einen Profiler denn bzw. wo bekomme ich einen her?

Messen braucht man da imho nix.
Alle Vorgänge die unter bestimmten Umständen länger als 1 Sek dauern, sollten meiner Meinung ausgelagert werden (sofern es sich nicht um die GUI handelt)

wie soll ich denn ohne Messen herausfinden welcher Vorgang über eine Sekunde dauert?

5.657 Beiträge seit 2006
vor 13 Jahren

Wie benutze ich so einen Profiler denn bzw. wo bekomme ich einen her?

Bitte die Forums-Suche benutzen, dann findest du z.B. diesen Beitrag: Kann mir jemand einen guten und kostenlosen Profiler empfehlen?

Weeks of programming can save you hours of planning

Hinweis von michlG vor 13 Jahren

@blackdynamic Bitte beachte [Hinweis] Wie poste ich richtig? Punkt 1.1, 1.1.1, 1.2 Mit einen kleinen Blick in die Doku oder Forensuche hättest du alle Fragen selbst beantworten können

Thema geschlossen