Laden...

Fragen zu Threading (Prio, Scheldule, Timer, Sleep, Sync, ...)

Erstellt von mosspower vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.340 Views
mosspower Themenstarter:in
456 Beiträge seit 2007
vor 15 Jahren
Fragen zu Threading (Prio, Scheldule, Timer, Sleep, Sync, ...)

[EDIT=herbivore]Auf myCSharp.de gilt vom Grundsatz: "Nur ein Thema pro Thread" ([Hinweis] Wie poste ich richtig? Punkt 1.2). Diesen Thread hier habe ich nur ausnahmsweise stehen lassen, weil alle Fragen wenigstens ins gleiche Forum gehört und eine Aufteilung in diesem speziellen Fall noch unübersichtlicher wäre.[/EDIT]

Hallo "Kollegen",

ich habe ein paar Fragen bezüglich Threading.

  1. Kann man Prioritäten, wie bei "herkömmlichen Threads auch" bei Threadpool-Threads setzen?

  2. Wie lange wird in einem Thread die Ausführung durchgeführt, also wie lange bekommt ein Thread Zeit für die Abarbeitung, wenn alle Threads die gleiche Priorität haben? Kann man das steuern oder kann man sagen, dass jeder Thread für die Abarbeitung immer eine bestimmte Zeit, z.B. 100 Nanosekunden, beim Betriebssystem Windows XP ect. zugewiesen bekommt. Kann man das eventuell steuern oder einstellen?

  3. Verwendet man grundsätzlich bei einem Thread, der zyklisch "laufen", bzw. dauernd laufen soll immer einen Timer oder lasst ihr euch manchmal zu Thread.Sleep hinreissen?

  4. Benutzt ihr bei nicht Formsanwendungen (z.B. Consoleanwendung) den Formstimer, wenn ihr nicht sicherstellen könnt, dass die Ausführung der Timermethode länger dauert als das eingestellte Interval? Der "normale" System.Timers läuft ja immer im Interval, auch wenn die Methode noch nicht beendet ist. Eine Variable wäre hier imo eine schreckliche Lösung, dann kann ich ja gleich Thread.Sleep verwenden. Nimmt man dann also den Forms-Timer, obwohl es sich nicht um eine Formsanwendung handelt?

  5. Was passiert eigentlich rein technisch im Hintergrund, wenn ich ein Objekt destroye, welches eine asynchrone Methode (müsste technisch eigentlich Background-Thread sein) aufgerufen hat und diese noch nicht abgearbeitet wurde? ThreadAbortException? Irgendwo muss ich doch Aufräumarbeiten durchführen können.

  6. Was passiert eigentlich, wenn ein Timer läuft und in der Timer-Methode ein Objekt synchronisiert wird, z.B. lock, indem die komplette Abarbeitung dauerhaft länger dauert als das Timer-Interval? Werden dann die Anforderungen in eine Queue geschrieben?, so dass rein theoretisch der Timer stundenlang im "Rückstand" sein kann?

So, das war es auch schon wieder. Vielen Dank für eure Antworten schon einmal im Voraus - und nein, ihr müsst natürlich nicht jeden Punkt kommentieren.

Gruß

P.S. 7) Mir ist noch ein siebter Punkt eingefallen. Komme ich irgendwie an die Threads ran vor dem Aufruf (BeginInvoke?). Ich möchte z.B. eine einheitliche CultureInfo setzen.

57 Beiträge seit 2009
vor 15 Jahren

Hallo mosspower,

das sind durch die Bank Fragen, die Du Dir im Selbststudium mit vertretbarem Aufwand selbst beantworten kannst. Dass Du Dir ein Buch oder die MSDN schnappst und dazu etwas liest, werde ich Dir nicht abnehmen.

Wenn Du das gemacht und konkrete Rückfragen hast, immer und gerne.

Gruß
Assri Komla

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 15 Jahren

Hallo Assri Komla,

wenn Du Dir die Fragen anschaust, dann sollte Dir schon klar sein, dass ich die gar nicht stellen könnte, wenn nicht vorher Bücher und MSDN gelesen wurden. Oder anders ausgedrückt. Wenn ich mir selbst auf alle meine vielen Fragen Antworten in Büchern und MSDN suche, dann bräuchte ich mittlerweile zwei Leben und hätte keine Zeit mehr arbeiten zu gehen. Desweiteren bräuchte ich kein Forum mehr (wo man auch hin und wieder Controls und kleine Utilities als Dankeschön zur Verfügung stellt) und müsste mich nicht mit unterqualifizierten Antworten rumärgern. Ich jedenfalls würde mein Wissen weitergeben, weil ich weiss, dass ich in dem Metier auf die Hilfe (Know-How von anderen) angewiesen bin. Wer würde denn heute noch als Softwareentwickler ohne Google, Foren oder Open Source überleben?

Gruß

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo mosspower,

Wenn ich mir selbst auf alle meine vielen Fragen Antworten in Büchern und MSDN suche, dann bräuchte ich mittlerweile zwei Leben und hätte keine Zeit mehr arbeiten zu gehen.

ich war gerade dabei eine Antwort abzuschicken, aber der zitierte Satz hat mich dann doch davon abgehalten. Wir sind nicht dafür da, die Arbeit zu übernehmen, für die du meinst keine Zeit zu haben.

herbivore

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 15 Jahren

Hallo herbivore,

das ist ja auch Dein gutes Recht. Ich bitte Dich aber nicht jedes Wort auf die Goldwage zu legen und bitte unterstellt mir jetzt nicht, dass ich keine Bücher lese oder MSDN und hier im Forum euch nur die Arbeit machen lassen möchte. Das ist ja schon fast eine Beleidigung. Aber gut, ich habe ja angefangen 😉

Gruß

57 Beiträge seit 2009
vor 15 Jahren

Hallo mosspower,

Deine Fragen sind so grundlegend und allgemein gehalten, dass der Eindruck entstehen muss, dass Du Dich nicht mit den von Dir zur Frage gestellten Themen ernsthaft beschäftigt hast. Die Antwort darauf, ob sich die Priorität von ThreadPool-Threads verändern lässt, steht in jedem Buch, das ich dazu gelesen habe, auf den ersten Seiten und ist trivial zu verstehen. Also halte Dich mit Deiner Wortwahl mal etwas zurück!

Und das ist auch nicht der erste Thread dieser Art, den ich hier im Forum lese.

Ich bin mit herbivore zwar nicht oft einer Meinung, aber in diesem Fall stimme ich ihm zu: Deine zeitlichen Probleme sind nicht unsere Probleme. Und dass Du Deine Arbeit auf uns abwälzen willst, ist nun einmal ein no go. Andere schaffen es auch, Beruf, Privatleben und Weiterbildung unter einen Hut zu bekommen.

Gruß
Assri Komla

3.971 Beiträge seit 2006
vor 15 Jahren

Was passiert eigentlich rein technisch im Hintergrund, wenn ich ein Objekt destroye, welches eine asynchrone Methode aufgerufen hat und diese noch nicht abgearbeitet wurde? ThreadAbortException? Irgendwo muss ich doch Aufräumarbeiten durchführen können.

  1. Du kannst keine Aufräumarbeiten durchführen, bzw. anstoßen. Das macht der GC bzw. die CLR für dich. Beim Müllsammeln wird jeder Verweis der sich gerade auf einen der Stacks befindet (jeder Thread hat einen) als Root-Objekt oder Root-Knoten angesehen. Diese Verweise und von diesen Instanzen auf andere verwiesenen Instanzen werden nicht vom GC aufgesammelt, da diese von noch mind. einem Thread aus erreichbar sind. Allerdings ist es möglich, das beispielsweise dein Timer-Objekt ungewollt freigegeben wird, weil es nirgends mehr im Code gebraucht wird. Resultat ist das dein Timer nicht periodisch aufgerufen wird, sondern vllt. nur 1mal, 2mal oder 3mal.

Kann man Prioritäten, wie bei "herkömmlichen Threads auch" bei Threadpool-Threads setzen?

Nein und sollte man tunlichst auch die Finger von lassen. Wenn du Prioritäten brauchst, erstell dir deinen eigenen Thread oder auch ThreadPool. ThreadPool-Threads laufen immer mit der Priorität normal und als Background-Threads.

Verwendet man grundsätzlich bei einem Thread, der zyklisch "laufen", bzw. dauernd laufen soll immer einen Timer oder lasst ihr euch manchmal zu Thread.Sleep hinreissen?

Wie schon oftmals geschrieben, einen Timer. Entweder einen Forms-Timer oder System.Threading.Timer. Thread.Sleep kann man zu kleinen Testzwecken mal verwenden, ansonsten nicht.

Was passiert eigentlich, wenn ein Timer läuft und in der Timer-Methode ein Objekt synchronisiert wird, z.B. lock, indem die komplette Abarbeitung dauerhaft länger dauert als das Timer-Interval? Werden dann die Anforderungen in eine Queue geschrieben?, so dass rein theoretisch der Timer stundenlang im "Rückstand" sein kann?

Guck dir dazu Monitor.Enter an.

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

mosspower Themenstarter:in
456 Beiträge seit 2007
vor 15 Jahren

Hallo @all,

ich möchte hier mal kurz etwas loswerden. Es ist nicht und niemals meine Absicht hier, jemand meine Arbeit machen zu lassen - das ist unter meiner Würde. Wenn ich offene Fragen habe, die sich auf ein Thema beziehen, wie eben hier in diesem Thread, dann notiere ich mir die immer und je nach Fragen stelle ich die auch schon mal in ein Forum ein. Nicht nur wegen möglicher Antworten, sondern um später auch mal eine Art Wiki zu haben und zu sehen, wie ich etwas implementiert habe oder wie es "damals" war.

Wenn ich jedoch den Eindruck vermitteln sollte, aufgrund von vielleicht vielen Fragen, wie hier im Thread, dass ich lediglich auf Antworten warte ohne dass ich mich zeitgleich auch aktiv (Bücher, Internet, MSDN) um die Antworten kümmere, der irrt sich gewaltig. Ich möchte das hier einfach nur klarstellen, so dass nicht der falsche Eindruck entsteht.

Es gibt öfter mal Threads, bei denen nur ich lediglich immer mal ein paar Kommentare hinzufüge, sozusagen nur einen Monolog führe, weil entweder keiner Antworten auf meine Fragen weiß, es zu trivial ansieht oder eben keine Lust hat zu Antworten. Lösungen poste ich dann auch abschließend, wenn ich die gefunden habe.

Ich finde dieses Forum eine Goldgrube und habe bisher auch mit niemanden hier Probleme gehabt - das möchte ich auch so in Zukunft belassen. Ich habe erst kürzlich angefangen (denn man braucht ja jahrelange Erfahrung) auch in Form von kleinen Projekten und Komponenten wieder etwas "zurückzugeben" - das wird in Zukunft noch viel mehr werden, da bin ich mir ganz sicher.

Ich bin hier im Forum für jede Antwort dankbar, ausdrücklich möchte ich mich stellvertretend hier für die letzte Antwort vom User kleines_eichhoernchen bedanken.

@herbivore, @Assri Komla,
sollte sich gestern einer vor den Kopf gestoßen gefühlt haben, dann möchte ich mich hier ausdrücklich entschuldigen. Mir ist einfach bei dem Posting von Assri Komla, soz. der "Schnürsenkel aufgesprungen" und ich ließ meinen Emotionen "ein bißchen" freien Lauf - das soll ja hin und wieder vorkommen.

Mag ja sein, dass es alles triviale Fragen sind, jedoch empfinde ich das nicht so, und bei meinen letzten beiden Arbeitgebern hätte nicht mal einer etwas mit dem Theam Threadpools anfangen können (OK, das ist auch mein Problem). Nichtsdestotrotz möchte ich noch abschließend darauf hinweisen, dass wir uns in einem Basics-Unterthread befinden.

So, das musste ich einfach mal loswerden.