Autor Beitrag
D.Follmann
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Do 27.03.08 12:38 
Hallo,

ich habe ein Problem mit einer Exception, die IMMER auftritt, wenn ich eine Komponente debugge. Bei normaler Auführung läuft das Programm einwandfrei, aber ich kann es aufgrund dieser Exception nicht mehr debuggen, was sehr problematisch ist, da ich auch andere Teile des Projektes noch ändern und debuggen muss. folgende Exception tritt beim debuggen auf, vielleicht kann mir ja jemand einen Tipp geben, was ich dagegen tun kann:

Exception:
===========

Type: System.Reflection.TargetInvocationException

Message: Ein Aufrufziel hat einen Ausnahmefehler verursacht.


Stacktrace:

bei System.RuntimeMethodHandle._InvokeMethodFast(Object target, Object[] arguments, SignatureStruct& sig, MethodAttributes methodAttributes,

RuntimeTypeHandle typeOwner)
bei System.RuntimeMethodHandle.InvokeMethodFast(Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes,

RuntimeTypeHandle typeOwner)
bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo

culture, Boolean skipVisibilityChecks)
bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo

culture)
bei System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
bei _3S.CoDeSys.Utilities.WeakMulticastDelegate.Invoke(Object[] args)
bei _3S.CoDeSys.MessageStorage.MessageStorage.FireCategoryAdded(IMessageCategory category)
bei _3S.CoDeSys.MessageStorage.MessageStorage.AddMessage(IMessageCategory category, IMessage message)
bei KEB.Combivis.Base.OnlineMonitor.OnlineStatusMonitor.updateView(Object o) in

C:\CVS_Work\dotnet\Combivis_Net\KEBBasePlugin\OnlineMonitor\OnlineStatusMonitor.cs:Zeile 172.



Inner Exception:
===================


Type: System.InvalidOperationException

Message:

Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement erfolgte von einem anderen Thread als dem Thread, für den es

erstellt wurde.


Stacktrace:

bei System.Windows.Forms.Control.get_Handle()
bei System.Windows.Forms.Control.SendMessage(Int32 msg, Int32 wparam, String lparam)
bei System.Windows.Forms.ComboBox.NativeAdd(Object item)
bei System.Windows.Forms.ComboBox.ObjectCollection.AddInternal(Object item)
bei System.Windows.Forms.ComboBox.ObjectCollection.Add(Object item)
bei _3S.CoDeSys.MessageView.MessageView.OnCategoryAdded(IMessageCategory category)

Vielen Dank im vorraus!

MfG

Dominik
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 27.03.08 12:42 
Wahrscheinlich hast Du einen try-except-Block drum herum, sodass Du das im Release nicht siehst.

Der Fehler tritt auf, weil Du hier
C:\CVS_Work\dotnet\Combivis_Net\KEBBasePlugin\OnlineMonitor\OnlineStatusMonitor.cs:Zeile 172
aus einem Thread auf ein Objekt zugreifen willst, welches in einem anderen Thread erstellt wurde. Das sagt die Fehlermeldung ja ;-)

Du wirst also mit Invoke arbeiten müssen. Die Doku hält unter dem Stichwort einige Beispiele bereit. Mehr Hilfe kann man nur geben, wenn Du ein bisschen von dem zeigst, was um Zeile 172 herum steht :-)

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
D.Follmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Do 27.03.08 12:48 
Hallo.

Ich habe zwar einen try/catch - Block drumherum, aber der würde mir im Fehlerfall eine Message-Box anzeigen.Das habe ich auch schon getestet, indem ich einen Fehler provoziert habe. ausserdem wird die Anweisung in der Zeile auch korrekt ausgeführt, was in der grafischen Oberfläche zu sehen ist.
Alos der Fehler scheint wirklich NUR beim debuggen aufzutreten...
Ich werde trotzdem mal nach "Invoke" gucken und sehen, ob mir das weiterhilft.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 27.03.08 12:52 
Es gab einen Befehl, dass thread-übergreifende Aufrufe nicht geprüft werden sollen. Hast Du den vielleicht mittels #ifdef im Debug-Modus benutzt?

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
D.Follmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Do 27.03.08 12:54 
was für ein Befehl ist das denn? habe da noch nie was von gehört und "mittels #ifdef benutzt" habe ich auch nichts, was immer das bedeutet ;)
meinst du man kann damit das prüfen auf solche ungültigen vorgänge ausschalten? wenn ja, wie würde das gehen?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 27.03.08 12:57 
user profile iconD.Follmann hat folgendes geschrieben:
was für ein Befehl ist das denn?
Ich müsste es nachgucken, aber dann müsste ich mich selber vierteilen, weil man diese Prüfung nicht ausschalten sollte *g*

user profile iconD.Follmann hat folgendes geschrieben:
habe da noch nie was von gehört und "mittels #ifdef benutzt" habe ich auch nichts,
Naja, sowas:
ausblenden C#-Quelltext
1:
2:
3:
#ifndef DEBUG
schalteAus();
#endif

(so ungefähr, hab's aus dem Kopf getippt und benutze C# schon eine Weile nicht mehr ;-))

user profile iconD.Follmann hat folgendes geschrieben:
meinst du man kann damit das prüfen auf solche ungültigen vorgänge ausschalten?
Ja.

user profile iconD.Follmann hat folgendes geschrieben:
wenn ja, wie würde das gehen?
In etwa so, wie ohne Airbag und Anschnallgurt auf der Autobahn 200km/h als Geisterfahrer zu fahren. :mrgreen:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
D.Follmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Do 27.03.08 13:06 
user profile iconChristian S. hat folgendes geschrieben:
In etwa so, wie ohne Airbag und Anschnallgurt auf der Autobahn 200km/h als Geisterfahrer zu fahren. :mrgreen:


na gut, mal angenommen ich wäre so verrückt mit 200 km/h als geisterfahrer auf der autobahn zu fahren, wie könnte ich die prüfung abschalten? ich finde zu dem thema leider nichts. ich denke mal, ich kann es wagen, weil das programm ja wie gesagt ohne debugger einwandfrei läuft. ist es möglich, dass das ein fehler im debugger ist, dass der irgendwie einen thread erzeugt oder so. oder dass der debugger genauer prüft als bei normaler ausführung des programms oder was auch immer?
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 27.03.08 13:09 
Diese Prüfung auszuschalten ist einfach unsauber. Synchronisiere lieber die Threads korrekt. Aber es ist ja Dein Programm, daher schau in der Doku mal unter CheckForIllegalCrossThreadCalls.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
D.Follmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Do 27.03.08 14:19 
Danke für den tipp, aber damit komme ich leider auch nicht weiter.An das control, welches die Exception wirft komme ich nicht ran, das ist Code von dritten, aber der wird zu 99,9% auch korrekt sein, denn beim normalen ausführen des Programmes läuft ja schliesslich alles einwandfrei.
ich glaube, das Problem liegt irgendwo anders. Denn der Fehler tritt NUR beim debuggen auf. das wundert mich besonders.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 27.03.08 17:06 
Es wäre wahrscheinlich auch hilfreich, wenn Du ein paar mehr Informationen rausrückst. Sonst kann man ja nur raten :nixweiss:

Vielleicht mal die Stelle aus dem Quelltext zitieren, an der der Fehler auftritt, damit man sich ansehen kann, ob da evtl. mehrere Thread beteiligt sind.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
D.Follmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Fr 28.03.08 10:08 
Hallo nochmal.

Ich habe das Problem jetzt gelöst. Der Befehl bei dem die Ausnahme auftrat stand in einer Methode, die von einem System.Threading.Timer zyklisch aufgerufen wurde. Diesen Timer habe ich jetzt durch einen System.Windows.Forms.Timer ersetzt und siehe da - es funktionert! Mich wundert nur trotzdem immer noch, dass die Exception NUR beim debuggen aufgetreten ist und der Befehl ansonsten ganz normal ausgeführt wurde.
maro158
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 35



BeitragVerfasst: Fr 28.03.08 19:06 
user profile iconD.Follmann hat folgendes geschrieben:
Ich habe das Problem jetzt gelöst. Der Befehl bei dem die Ausnahme auftrat stand in einer Methode, die von einem System.Threading.Timer zyklisch aufgerufen wurde. Diesen Timer habe ich jetzt durch einen System.Windows.Forms.Timer ersetzt und siehe da - es funktionert!


Du hast Dein Problem erfolgreich umschifft.

Warum es nicht mit System.Threading.Timer funktionierte, hat eigentlich schon Christian S. erklärt. Die Lösung ist einfach (Stichwort: Control.InvokeRequired). Nach nur wenigen Zeilen Code, läuft die Anwendung auch im Debugger wieder.

Vielleicht noch ein kleiner Hinweis: Deine try..catch-Mechanik hat im Debugger keine Chance, da der JIT-Debugger die Ausführung der Anwendung wegen der unbehandelten Ausnahme sofort unterbricht (Stichwort: NativeWindow.DebuggableCallBack).

Zitat:
Mich wundert nur trotzdem immer noch, dass die Exception NUR beim debuggen aufgetreten ist und der Befehl ansonsten ganz normal ausgeführt wurde.


Im .NET Framework 1.1 konnte man sich selber ins Bein schießen, indem man Steuerelemente threadübergreifend aktualisierte. Das kann sehr leicht schief gehen. Daran hat sich auch unter .NET 2.0 grundsätzlich nichts geändert. Alter, threadübergreifender Code tut weiterhin (bis zum Crash) und neuer schlechter Code auch! Nur wenn man die Anwendung im Debugger laufen läßt, wird die Fehlerquelle sofort sichtbar!
D.Follmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Mo 31.03.08 07:20 
Ok, sehe ich ein.aber die voregschlagene Lösung mit Contol.InvokeRequired usw. kommt leider nciht in Frage, weil ich eine Methode eines Frameworks aufrufe, welches von dritten implementiert wurde und daher keinen direkten Zugriff auf das Control habe, auf das durch den Methodenaufruf zugegriffen wird. darum kann ich Invoke() nicht aufrufen. Da es mit dem SWF.Timer läuft bin ich aber auch so jetzt zufrieden ;)