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
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 | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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?
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 | <span style="font-size: 10;">my</span><span style="font-size: 10;">CSharp</span><span style="font-size: 10;">.de</span> - gemeinsam mehr erreichen
Für längere Zeit inaktiv.
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.
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 ...
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
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
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...
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?
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
@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