Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

Sinnvolles Threading: An welchen Stellen soll man Threading einsetzen?
blackdynamic
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

Sinnvolles Threading: An welchen Stellen soll man Threading einsetzen?

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
zero_x
myCSharp.de - Member

Avatar #avatar-2567.gif


Dabei seit:
Beiträge: 1.044
Herkunft: Koblenz

beantworten | zitieren | melden

Hallo blackdynamic,

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

zero_x
zero_x | myCSharp.de - gemeinsam mehr erreichen

Für längere Zeit inaktiv.
private Nachricht | Beiträge des Benutzers
blackdynamic
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von blackdynamic am .
private Nachricht | Beiträge des Benutzers
zero_x
myCSharp.de - Member

Avatar #avatar-2567.gif


Dabei seit:
Beiträge: 1.044
Herkunft: Koblenz

beantworten | zitieren | melden

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
zero_x | myCSharp.de - gemeinsam mehr erreichen

Für längere Zeit inaktiv.
private Nachricht | Beiträge des Benutzers
Corpsegrinder
myCSharp.de - Member



Dabei seit:
Beiträge: 401

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
blackdynamic
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

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 ...
private Nachricht | Beiträge des Benutzers
Uwe81
myCSharp.de - Member



Dabei seit:
Beiträge: 282
Herkunft: Ludwigshafen

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
michlG
myCSharp.de - Experte

Avatar #avatar-2909.png


Dabei seit:
Beiträge: 3.430
Herkunft: Naturns - Südtirol - Italien

beantworten | zitieren | melden

Zitat
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
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 3.971
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
blackdynamic
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

Zitat von Uwe81
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?
Zitat von michlG
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?
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5.649
Herkunft: Leipzig

beantworten | zitieren | melden

Zitat von blackdynamic
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
private Nachricht | Beiträge des Benutzers

Moderationshinweis von michlG (27.08.2010 - 19:05)

@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