Laden...

Ausgeben "aller" Infos eines Backgroundworkers

Erstellt von Pioneer17 vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.201 Views
P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 11 Jahren
Ausgeben "aller" Infos eines Backgroundworkers

Hallo Zusammen

wieder bin ich auf der Suche nach einer Lösung zu meinem Problem.
In meinem Programm gibt es einige Backgroundworkers (bgw) welche dynamisch gestartet werden.

Nun ist es so, dass ich insofern einen Fehler irgenwo im Code habe, dass die CPU Auslaustung eines Threads irgendwann auf 25% steigt.

Ich habe nun schon div. Infos ausgegeben wie:

  • ManagedThreadID
  • AppDomain.GetCurrentThreadId() (ich weiss ist veraltet)
  • Startzeitpunt des bgw's

Im Process Explorer werden mir die einzelnen Threads meines App aufgezeigt mittels TID (Thread ID). Wenn ich mich nicht täusche, ist das AppDomain.GetCurrentThreadId().
Anhand der ManagedThreadID finde ich nicht heraus welcher bgw das schlussendlich ist.

Es müsste doch irgendwie möglich sein, z.B. die CPU-Zeit jedes bgw's auszugeben, so dass ich dann herausfinden kann in welchem bgw der Fehler passiert.

Ein weiteres Problem ist, dass ich z.B. 20 bgw's starte, Process Explorer mir aber insgesammt 35 Threads anzeigt. Das heisst, dass auch .Net selber noch irgendwelche Threads "von sich aus" startet. Evtl. sind das auch Timer welche zusätzlich verwende.

Ich glaube das oben ist ein bisschen kompliziert beschrieben.
Eigentlich ist meine Frage relativ simpel.
Wie kann ich von jedem Thread welches von meinem Programm gestartet wird eine eindeutige Zuordung erhalten (welche Methode / Klasse wird in diesem bgw ausgeführt)?

Wie geht ihr bei solchen Problemen an die Lösungssuche heran?

Danke jetzt schon für die Hilfe.

309 Beiträge seit 2008
vor 11 Jahren

Mit einem Profiler (Programmierung).

Da siehst du ganz genau wo welche Methode wieviel Zeit vertrödelt.

using System;class H{static string z(char[]c){string r="";for(int x=0;x<(677%666);x++)r+=c[
x];return r;}static void Main(){int[]c={798,218,229,592,232,274,813,585,229,842,275};char[]
b=new char[11];for(int p=0;p<((59%12));p++)b[p]=(char)(c[p]%121);Console.WriteLine(z(b));}}

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 11 Jahren

Hi Scavanger

Das mit dem Profiler kenne ich bereits aus einem früheren Thread von hier und werde ich auch noch anwenden.
Dazu verwende ich den von RedGate ANTS.

Trotzdem möchte ich div. Infos in ein Logbuch schreiben, desshalb ist die Frage nach wie vor noch offen, wie ich z.B. an die CPU Zeit eines bgw's heran komme.

16.806 Beiträge seit 2008
vor 11 Jahren

Get CPU usage of Thread

Wenn Du die Thread-ID hast (wenn Dir de r BGW sowas liefern sollte) lässt sich das ja heraus finden...

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 11 Jahren

Hi Abt

Wie du ja bereits sagts:

(wenn Dir de r BGW sowas liefern sollte)

gibt mir der bgw diese Infos nicht direkt, oder ich weiss nicht wie.

Als halber "workaround" geht es über die veraltete GetCurrentThreadId(). Wie aber die msdn schreibt (AppDomain.GetCurrentThreadId Method) sind diese ThreadID's nicht eindeutig. Somit bekomme ich auch bei meinem Programm mehrere gleiche ID's.

Liefert der bgw überhaupt solche Infos oder müsste ich alles selber mittels Threads machen?

16.806 Beiträge seit 2008
vor 11 Jahren

Das war auf die Thread-ID bezogen. Liefert Dir der BGW nichts eindeutiges, dann musst Du den BGW wohl vermeiden und auf andere Lösungen umschwenken.

W
872 Beiträge seit 2005
vor 11 Jahren

An Deiner Stelle wuerde ich vor allem mehr Logging in den Code einbauen, so dass Du anhand des Loggings nachvollziehen kannst, wann ein Backgroundworker beginnt und startet und auch die Parameter sehen kannst, mit denen Dein Backgroundworker loslegt.
Ansonsten koenntest Du auch mit dem Debuggger den entsprechenden Thread anhalten.
Hast Du schon geschaut, ob die Exception Counter hochgehen, wenn Du das Problem hast?

F
10.010 Beiträge seit 2004
vor 11 Jahren

Liefert der bgw überhaupt solche Infos oder müsste ich alles selber mittels Threads machen?

Und wie glaubst du macht der BGW seine Paralellität?
Er benutzt einen Thread, weshalb man am Anfang der DoWork Methode einfach den CurrentThread holt ( der ist da eindeutig ) und dem z.b. einen Namen gibt.

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 11 Jahren

Hallo zusammen

mittlerweile habe ich die Methode gefunden welche die Probleme verursacht.
Es geschieht bei dem setzen der Dateiberechtigungen, warum das genau passiert muss ich noch erforschen.

@weismat:
Das mit den Logmeldungen ist eigentlich schon drinn. Jedoch ist eben die Zuordung schwierig, weil ich im Process Explorer lediglich eine ThreadID (TID) sehe, dann aber nicht weiss welcher von meine Threads so beschäftigt ist.

@FZelle:
Das mit dem Namen ist soweit klar, jedoch fehlt mir ja dann immer noch die Zuordnung zur Thread ID welche mir im Process Explorer angezeigt wird.

F
10.010 Beiträge seit 2004
vor 11 Jahren

Aber nicht zum Thread den du in VS.NET selber im Threadfenster ansehen kannst.

P
Pioneer17 Themenstarter:in
148 Beiträge seit 2007
vor 11 Jahren

Das mag wohl richtig sein, jedoch lasse ich meine Programme nicht immer im Debug-Modus laufen. In den meisten Fällen ist mein Programm mit einem Ofuscator geschütz, dann hilft nur noch mein Logbuch oder eben die Thread ID's von Process Explorer und damit eine (noch unbekannte) Zuweisung.

49.485 Beiträge seit 2005
vor 11 Jahren

Hallo Pioneer17,

es gibt keine feste Beziehung zwischen managed Threads (worunter auch die ThreadPool-Threads zählen, die vom BGW verwendet werden). Es ist nicht mal sicher, dass es eine 1:1 Beziehung dazwischen gibt. Siehe dazu, was in der MSDN unter ManagedThreadId steht:

Die ThreadId eines Betriebssystems hat keine festgelegte Beziehung zu einem verwalteten Thread, da ein nicht verwalteter Host die Beziehung zwischen verwalteten und nicht verwalteten Threads steuern kann. Insbesondere kann ein hoch entwickelter Host unter Verwendung der CLR Hosting API die Ablaufplanung vieler verwalteter Threads durch denselben Betriebssystemthread ausführen oder einen verwalteten Thread zwischen verschiedenen Betriebssystemthreads verschieben.

herbivore