Entwickler-Ecke
Sonstiges (.NET) - Observable - Auf Ausführung des Events warten
FrEEzE2046 - Do 20.05.10 13:09
Titel: Observable - Auf Ausführung des Events warten
Ich habe - abstrahiert - folgendes Szenario:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| var obs = Observable.FromEvent<AsyncCompletedEventArgs> ( h => this.Class.AsyncMethodCompleted += h, h => this.Class.AsyncMethodCompleted -= h ) .Take(1);
obs.Subscribe ( e => { MessageBox.Show("AsyncMethodCompleted"); } );
this.Class.AsyncMethod(); |
Bei AsyncMethod() handelt es sich - welch Überraschung - um eine asynchrone Methode.
Ich möchte nun erreichen, dass das System nach dem AsyncMethod() Aufruf so lange wartet, bis das Event (e) gecalled wurde.
Ich habe gelesen, dass man dafür Observable.ObserveOnDispatcher<TSource> (selbst erklärend denke ich) ausführen soll.
Leider kann ich dies nicht einmal testen, da "meine" Observable Klasse diese Methode nicht besitzt (!).
Ich habe die System.Reactive.dll aus dem Silverlight 4.0 Toolkit eingebunden.
RuntimeVersion = v2.0.50727
Version = 1.0.0.0
Irgendwie irritiert mich das ein wenig. Weiß jemand wie ich meine Anforderung umsetzen kann?
Moderiert von
Kha: Topic aus C# - Die Sprache verschoben am Do 20.05.2010 um 13:45
Kha - Do 20.05.10 14:07
Jetzt auch noch Rx, deine Fragen gefallen mir wirklich :D .
FrEEzE2046 hat folgendes geschrieben : |
Ich habe die System.Reactive.dll aus dem Silverlight 4.0 Toolkit eingebunden. |
Selbst Schuld, würde ich doch da mal sagen ;) . In der offiziellen Version (1.0.2521.204) ist die Methode jedenfalls vorhanden. Wobei ich Rx im Toolkit auf Anhieb gar nicht finde :gruebel: .
Bei deinem Problem wird dir die Methode jedenfalls nicht helfen. Wenn der UI-Thread geblockt ist, wird auch kein Dispatcher mehr abgearbeitet.
Geht es dir nur darum,
AsyncMethod zu einem synchronen Aufruf zu machen? Eigentlich haben die SL-Entwickler sich schon etwas gedacht, als sie oft nur asynchrone Methoden implementiert haben (und gerade um das einfache Verarbeiten asynchroner Events geht es ja bei Rx), aber es sollte so am einfachsten möglich sein: Nimm ein
AutoResetEvent und warte per
WaitOne darauf, dass du im Completed-Handler
Set aufrufst.
FrEEzE2046 - Fr 21.05.10 16:27
Kha hat folgendes geschrieben : |
Nimm ein AutoResetEvent und warte per WaitOne darauf, dass du im Completed-Handler Set aufrufst. |
Das hatte ich schon probiert. Dabei stürzt immer der Browser ab.
Kha - Fr 21.05.10 16:40
Kann ich auf die Schnelle nicht nachvollziehen, aber dann wirst wohl doch asynchron arbeiten müssen.
FrEEzE2046 - Mi 26.05.10 09:40
Kha hat folgendes geschrieben : |
Kann ich auf die Schnelle nicht nachvollziehen, aber dann wirst wohl doch asynchron arbeiten müssen. |
Das Problem scheint zu sein, dass beide Klassen auf dem selben Thread abgearbeitet werden und das Waiting dann den anderen Prozess blockiert.
Das Problem ist halt, dass die Seite zwingend die Kommunikation mit dem WCF-Service braucht. Sollte dieser in seinem Konstruktor eine Exception werfen, dann bekomme ich dies erst beim ersten Methoden-Aufruf mit. Daher habe ich mir eine Dummy-Methode gemacht, auf dessen Ende ich warten muss, um zu sehen, ob alles glatt gegangen ist.
Wenn nicht, macht die ganze Seite keinen Sinn. Daher würde ich schon gerne warten.
Kha - Mi 26.05.10 10:58
FrEEzE2046 hat folgendes geschrieben : |
Das Problem scheint zu sein, dass beide Klassen auf dem selben Thread abgearbeitet werden und das Waiting dann den anderen Prozess blockiert. |
Das kann natürlich sein. Wenn du den asynchronen Vorgang stattdessen in einem neuen Thread startest (-> SynchronizationContext ist null), sollte auch der Completed-Handler in einem Nebenthread abgearbeitet werden.
FrEEzE2046 hat folgendes geschrieben : |
Wenn nicht, macht die ganze Seite keinen Sinn. Daher würde ich schon gerne warten. |
Kannst du nicht die GUI leer lassen oder wasauchimmer und dann entsprechende auf die asynchrone Exception reagieren?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!