Laden...

Forenbeiträge von FischeFr Ingesamt 3 Beiträge

23.12.2018 - 07:16 Uhr

Danke zusammen - jetzt funktionierts.

Der Lock auf einen Event ist gleich mehrfach dämlich:- ist null, wenn noch keine Subscription vorliegt

  • Object wird bei jedem Subscribe durch ein neues (Ergebnis von Delegate.Combine) ausgetauscht

Eigentlich weiß ich das, aber ich bin einfach gestern zu lange vorm Rechner gesessen. War geistig nicht mehr ganz fit 🤔

Ich hatte folgendes Beispiel gemeint. Allerdings benutzen die ein "lockObject", das im Beispiel nicht deklariert wird. Hier das Event zu benutzen war wohl auf meinem eigenen Mist gewachsen.

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/events/how-to-implement-custom-event-accessors

22.12.2018 - 19:50 Uhr

Ich danke dir!

Ich war wohl so vertieft, dass ich immer die falsche Zeile angesehen hab. Null locken ist natürlich keine gute Idee 😃

Das Locking hab ich von einem Beispiel von Microsoft (blind) übernommen.

22.12.2018 - 18:46 Uhr

Hallo zusammen!

Ich habe ein kleines Projekt gestartet, bei dem PowerShell-Code in einem C#-Programm ausgeführt wird. In Sachen Events könnte ich jetzt von euch etwas Hilfe gebrauchen. Ich kämpfe den ganzen Tag schon mit folgender Fehlermeldung:

Fehlermeldung:
System.Reflection.TargetInvocationException: Ein Aufrufziel hat einen Ausnahmefehler verursacht. ---> System.ArgumentNullException: Der Wert darf nicht NULL sein.
bei System.Threading.Monitor.Enter(Object obj)
bei PSService.PowershellService.ServiceEventsForScript.add_Stop(EventHandler`1 value)
--- Ende der internen Ausnahmestapelüberwachung ---
bei System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
bei System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
bei System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
bei System.Reflection.EventInfo.AddEventHandler(Object target, Delegate handler)
bei System.Management.Automation.PSLocalEventManager.ProcessNewSubscriber(PSEventSubscriber subscriber, Object source, String eventName, String sourceIdentifier, PSObject data, Boolean supportEvent, Boolean forwardEvent)
bei System.Management.Automation.PSLocalEventManager.SubscribeEvent(Object source, String eventName, String sourceIdentifier, PSObject data, ScriptBlock action, Boolean supportEvent, Boolean forwardEvent, Int32 maxTriggerCount)
bei Microsoft.PowerShell.Commands.ObjectEventRegistrationBase.EndProcessing()
bei System.Management.Automation.CommandProcessorBase.Complete()

Dieses Problem trifft auf, wenn das PowerShell-Skript versucht, einen Subscribe-Vorgang auf ein von mir bereitgestelltes Event auszuführen. Ein entsprechender (sinnfreier) Versuchscode sieht folgendermaßen aus:

            public event EventHandler<EventArgs> StopEvent;
            public event EventHandler<EventArgs> Stop
            {
                add
                {
                    lock (StopEvent)
                    {
                        StopEvent += value;
                    }
                }
                remove
                {
                    lock (StopEvent)
                    {
                        StopEvent -= value;
                    }
                }
            }

Vermutlich spielt die PowerShell-Zeile keine Rolle, aber vollständigkeitshalber lautet sie wie folgt:

Register-ObjectEvent -InputObject $Host.PrivateData.Events -EventName 'StopEvent' -SourceIdentifier 'PSService_Stop' -ErrorAction Stop | Out-Null

Bei Verwendung von "StopEvent" klappt alles prima, bei "Stop" bekomme ich die obige Fehlermeldung. "StopEvent" ist hier nur testweise eingefügt. Das "echte" Event, an das weitergeleitet werden muss ist in einer anderen Klasse. Hat von euch jemand eine Idee, was da schief läuft?