Benutzer mit den meisten Antworten
Invoke() und Exceptions, sehe bei MSDN nicht klar.

Frage
-
Hallo Community,
die MSDN Hilfe zu Invoke-Methoden erscheint mir unvollständig, aber vielleicht sitzt das Problem auch vor der Tastatur. Wie dem auch sei, angenommen man schreibt folgenden Code:
public class myClass { delegate void LoopInvariant(); public void GenericLoop(LoopInvariant loopInvariant) { for(int i=0; i<10; i++) { try { loopInvariant.Invoke(); } catch(myException) { } } } public void ExceptionalLoop() { LoopInvariant loopInvariant = new LoopInvariant(delegate() { throw new myException(); }); GenericLoop(loopInvariant); } }
Ich bin mir relativ sicher, dass dieses Invoke() meine anonyme Methode im selben Thread, synchron ausführt. Ich bin mir aber nicht sicher, ob ich TargetInvocationException und myException fangen sollte in GenericLoop. Meine Suche in MSDN scheitert leider schon daran, dass es keine Beiträge für .Invoke() gibt. Folglich kann man auch nicht wissen, welche Exceptions dieses Invoke wirft. Ein Go to definition auf Invoke in VS 2015 geht einfach nur auf meine delegate Deklaration. Und wenn ich auf der ein Go to definition mache passiert gar nichts. D.h. ich kann auch nicht nachschauen, was sich der Schnittstellendesigner mal bei dem Invoke gedacht hat (in Sachen Exceptionhandling).
p.s. Sorry, bin im falschen Unterforum gelandet, der Code ist in C#.
Ich habe den oben genannten Code ausprobiert, es wird myException geworfen. Die Frage ist nur, kann ich eine TargetInvocationException kategorisch ausschließen? Eine TargetInvocationException ist für Invokes welche Reflection nutzen vorgesehen. Bei anonymen Methoden bin ich mir jetzt aber nicht sicher, was der Compiler daraus macht.
Ich würde mich über (den Sachverhalt) aufklärende Beiträge freuen :-)- Bearbeitet FrankNaumann Mittwoch, 28. September 2016 16:50
- Verschoben Dimitar DenkovMicrosoft contingent staff, Administrator Donnerstag, 29. September 2016 06:10 Der Code ist in C# (aus: Visual C++/CLI)
Antworten
-
Hallo Frank,
woher die Invoke-Methode kommt weiß ich ehrlich gesagt auch nicht. Weder System.Delegate noch System.MultiucastDelegate haben eine solche Methode. Es liegt die Vermutung nahe, dass der C# Compiler die Methode zu dem delegate-Typ hinzufügt, aber in der C# Spezifikation ist davon auch nichts zu finden.
Der Aufruf von Invoke() scheint einem normalen Aufruf in der C#-Form zu entsprechen (deckt sich mit Peters Antwort):
loopInvariant();
Daher vermute ich, dass die Methode aus Kompatibilitätsgründen zu anderen Sprachen existiert, welche Delegaten nicht mit der ()-Syntax aufrufen können.
Und genauso verhält es sich mit Exceptions. Du kannst hier eine myException bekommen, aber keine TargetInvocationException wenn eine myException geworfen wird. Der Aufruf verhält sich wie ein normaler Methodenaufruf.
Anders sähge es aus, wenn du den Delegaten über sein MethodInfo-Objekt aufrufst.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert FrankNaumann Donnerstag, 29. September 2016 12:37
Alle Antworten
-
Hallo Frank,
welche Invoke-Methode meinst du denn? Einmal gibt es die Invoke-Methode welche Code im UI-Thread ausführt, siehe Control.Invoke bzw. Dispatcher.Invoke. Das du das meinst liegt nahe, da du Threads ansprichst. Und dann gibt es noch die Invoke-Methode um einen Delegaten auszuführen, das verwendest du in deinem Code.
Entsprechend hast du recht, dass dein Code alles im selben Thread ausführt. Um das ggf. zu ändern brauchst du eine der anderen Invoke-Methoden.
Was hast du also genau vor?
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Bearbeitet Tom Lambert (Koopakiller)Moderator Mittwoch, 28. September 2016 19:16
-
Hi Frank,
eine Delegate.Invoke bewirkt lediglich den Aufruf der angegebenen Methode (Sprungadresse), ohne dass diese in einem anderen Thread ausgeführt wird. Wenn Du die Ausführung asynchron in einem anderen Thread haben willst, dann musst Du Delegate.BeginInvoke nutzen. Ich vermute jedoch wie Tom, dass Du etwas anderes suchst.--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Warum Groß- und Kleinschreibung wichtig ist:
Der Gefangene floh.
Der gefangene Floh. -
Hallo Frank,
welche Invoke-Methode meinst du denn? ...
Was hast du also genau vor?
Tom Lambert - .NET (C#) MVP
Hallo Tom,
ich beziehe mich ganz konkret auf den nicht-dynamischen Invoke()-Aufruf an einem parameterlosen Delegaten ohne Rückgabetyp (also genau wie im Code beschrieben). Die Eigenschaft, dass bei der Ausführung kein Threadwechsel stattfindet ist sehr wichtig für meinen Anwendungsfall, aber nicht so sehr für meine Frage, ob
man in der GenericLoop Methode auch eine TargetInvocationException erwarten können müsste, wenn man Invoke() an einem parameterlosen Delegaten ohne Rückgabetyp verwendet.
Mich würde zudem auch ganz allgemein interessieren, wann ein Invoke eine TargetInvocationException werfen kann und wann nicht. Laut Microsoft immer dann, wenn Reflection verwendet wird um den Invoke auszuführen. Aber woran erkenne ich, ob ein [Dynamic]Invoke(..) Reflection nutzen wird?
-
Hallo Frank,
woher die Invoke-Methode kommt weiß ich ehrlich gesagt auch nicht. Weder System.Delegate noch System.MultiucastDelegate haben eine solche Methode. Es liegt die Vermutung nahe, dass der C# Compiler die Methode zu dem delegate-Typ hinzufügt, aber in der C# Spezifikation ist davon auch nichts zu finden.
Der Aufruf von Invoke() scheint einem normalen Aufruf in der C#-Form zu entsprechen (deckt sich mit Peters Antwort):
loopInvariant();
Daher vermute ich, dass die Methode aus Kompatibilitätsgründen zu anderen Sprachen existiert, welche Delegaten nicht mit der ()-Syntax aufrufen können.
Und genauso verhält es sich mit Exceptions. Du kannst hier eine myException bekommen, aber keine TargetInvocationException wenn eine myException geworfen wird. Der Aufruf verhält sich wie ein normaler Methodenaufruf.
Anders sähge es aus, wenn du den Delegaten über sein MethodInfo-Objekt aufrufst.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort markiert FrankNaumann Donnerstag, 29. September 2016 12:37
-
Hi Frank,
Invoke wird als Bezeichnung für den Sprung zu einer hinterlegten Adresse in sehr unterschiedlichen Objekttypen/Klassen mit auch sehr unterschiedlichen Wirkungsweisen genutzt. Das ist wirklich etwas verwirrend. Andererseits gibt es unterschiedliche Bezeichnungen für scheinbar gleiche Sachverhalte (z.B. Text-Eigenschaft - Content-Eigenschaft). Auch das ist verwirrend.--
Viele Grüsse
Peter Fleischer (MVP, Partner)
Meine Homepage mit Tipps und Tricks
Warum Groß- und Kleinschreibung wichtig ist:
Der Gefangene floh.
Der gefangene Floh.