Autor Beitrag
FrEEzE2046
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
BeitragVerfasst: Do 20.05.10 13:09 
Ich habe - abstrahiert - folgendes Szenario:
ausblenden 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 user profile iconKha: Topic aus C# - Die Sprache verschoben am Do 20.05.2010 um 13:45
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 20.05.10 14:07 
Jetzt auch noch Rx, deine Fragen gefallen mir wirklich :D .

user profile iconFrEEzE2046 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
BeitragVerfasst: Fr 21.05.10 16:27 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 21.05.10 16:40 
Kann ich auf die Schnelle nicht nachvollziehen, aber dann wirst wohl doch asynchron arbeiten müssen.

_________________
>λ=
FrEEzE2046 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
BeitragVerfasst: Mi 26.05.10 09:40 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 26.05.10 10:58 
user profile iconFrEEzE2046 hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconFrEEzE2046 hat folgendes geschrieben Zum zitierten Posting springen:
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?

_________________
>λ=