Autor Beitrag
C#
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Fr 08.05.15 19:19 
Hallöle,

ich habe ein recht merkwürdiges Problem bei Multithreading:

Ich habe eine statische Klasse. Als Klassenvariable habe ich ein Thread-Array threads und einen separaten Thread threadManager. Wird eine Methode der Klasse aufgerufen, startet der threadManager. In diesem werden dann wiederum die Threads aus dem Array threads gestartet (jeder Prozessor ein Thread, in meinem Fall 8 ).
Die Threads arbeiten fröhlich vor sich hin (jeder Thread macht im Prinzip das Gleiche).

Beim Debuggen ist mir jedoch aufgefallen, dass nach kurzer Zeit (manchmal sogar direkt bei Thread.Start()) ein oder zwei Threads einfach abschmieren und weg sind, ohne dass ich eine Fehlermeldung erhalte. Wenn ich mit dem Debugger dann das Array unter die Lupe nehme und die verschwundenen Threads untersuche, erhalte ich bei der Eigenschaft "ApartmentState" folgende Exception:
Zitat:
'threads[7].ApartmentState' löste eine Ausnahme des Typs 'System.Threading.ThreadStateException' aus

An den ApartmentStates drehe ich aber nie rum. Die sind immer auf MTA.

Hat jemand eine Ahnung warum einzelne Threads (manchmal schon direkt beim Start) hier abschmieren? Die Threads sind übrigens nicht aus dem Threadpool.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 08.05.15 19:30 
Die ThreadStateException wirst du wohl bekommen weil der Thread weg ist und dann schwer ist nach dem Zustand zu fragen ;) Ist damit einfach ein Folgeproblem des eigentlichen Problems und solltest du bei der Fehlersuche nicht allzu sehr beachten.

Hast du denn Debugger so eingestellt das er hält beim Exception werfen? Sonst wirst du bei den Threads viele Exceptions nicht zu sehen bekommen da sie still behandelt werden und nicht bis zu einem Punkt durchfallen denn du behandeln könntest. Wenn dann auch nix greifbares kommt dann vielleicht mal an den AppDomain.CurrentDomain.UnhandledException Event hängen und schauen ob da was hilfreiches ankommt.

Für diesen Beitrag haben gedankt: C#
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: Fr 08.05.15 20:01 
Momentan hält er bei Exceptions an. Es ist dabei ja egal von welchem Thread die Exception geworfen wird oder?

// EDIT
Also weder Debugger, noch AppDomain.CurrentDomain.UnhandledException empfangen eine Exception.

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
C# Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 561
Erhaltene Danke: 65

Windows 10, Kubuntu, Android
Visual Studio 2017, C#, C++/CLI, C++/CX, C++, F#, R, Python
BeitragVerfasst: So 10.05.15 17:51 
Hat keiner eine Idee?

_________________
Der längste Typ-Name im .NET-Framework ist: ListViewVirtualItemsSelectionRangeChangedEventHandler
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 11.05.15 20:35 
Da scheinbar keiner eine Idee hat zeig doch mal Code. Am besten irgendwas was man lokal auch nachvollziehen kann. Also möglichst kompilierbar.