SL 4.0 | In MainPage auf Beendigung der Authentifizierung warten



  • Guten Morgen und einen fröhlichen ersten Advent wünsche ich.

    Ich habe folgendes "Problem":
    Ich habe eine Silverlight Applikation, welche eine CustomAuthentication verwendet. Die Authentifizierung findet beim Start der Applikation statt:

    private void Application_Startup(object sender, StartupEventArgs e)
    {
        AuthenticationDomainContext authCtx = this.Resources["authCtx"] as AuthenticationDomainContext;
    
        this.m_busyIndicator.BusyContent = "Authentication is in progress ...";
        this.m_busyIndicator.IsBusy = true;
    
        authCtx.Load(
            authCtx.GetUserQuery(),
            new Action<LoadOperation<User>>(
                (args) =>
                {
                    this.Resources.Add(
                        "authUser",
                        (args.Entities.FirstOrDefault())
                    );
    
                    this.m_busyIndicator.IsBusy = false;
                }
            ),
            true
        );
    
        this.m_busyIndicator.Content = new MainPage();
        this.m_busyIndicator.HorizontalContentAlignment = HorizontalAlignment.Stretch;
        this.m_busyIndicator.VerticalContentAlignment = VerticalAlignment.Stretch;
        this.RootVisual = this.m_busyIndicator;
    }
    

    Soweit so gut. Nun ist es aber erforderlich, dass bevor in der MainPage gearbeitet werden kann, die Authentifizierung beendet ist. Ich könnte also noch im Application_Startup den ansich Asynchronen Aufruf von Load() blocken, bis die Operation abgeschlossen ist.
    Es widerspricht jedoch meiner Aufassung von Programmierung. Die Konstruktion der grafischen Oberfläche der MainPage und einige andere "on Startup" Routinen können bzw. sollen parallel dazu verarbeitet werden.

    Ich würde also gerne erst in der "letzten Code-Zeile" meiner MainPage - Verarbeitungskette diesen Block einbauen.
    Mir fehlt jedoch einfach der Ansatz dafür. Sehr elegant würde ich so etwas findet (Pseudo-Code):

    AutoResetEvent authEvent = new AutoResetEvent(false);
    
    var authObs = Observable.FromEvent(
    	h => authProcess.OnFinish += h,
    	h => authProcess.OnFinish -= h
    )
    .Take(1);
    
    authObs.Subscribe(
    	e => {
    		authEvent.Set();
    	}
    );
    
    authEvent.WaitOne();
    

    Abgesehen von meiner Befürchtung, dass WaitOne() mit alles blocken wird (eben auch die Authentifizierung), wüsste ich nicht welches Event ich dafür her nehmen sollte.

    Für jede Anregung / Lösungsmöglichkeit wäre ich wirklich dankbar!



  • Warum probierst du es nicht einfach aus?

    Wenn ich das richtig verstanden habe ist Load() doch ein asynchroner Aufruf, sprich er läuft in einem anderen Thread. Daher sollte er eigentlich nicht blockieren, wenn in einem anderen Thread auf ein Event gewartet wird.

    Allerdings muss ich dazu sagen, dass ich von Silverlight so gut wie keine Ahnung habe. 😃



  • O.o schrieb:

    Warum probierst du es nicht einfach aus?

    Wenn ich das richtig verstanden habe ist Load() doch ein asynchroner Aufruf, sprich er läuft in einem anderen Thread. Daher sollte er eigentlich nicht blockieren, wenn in einem anderen Thread auf ein Event gewartet wird.

    Allerdings muss ich dazu sagen, dass ich von Silverlight so gut wie keine Ahnung habe. 😃

    Dakne für deine Antwort. Load() ist in der Tat asynchron und blockt selbst nicht. D.h. dass bereits mit der Konstruktion der MainPage begonnen wird, während Load() noch arbeitet.

    Es würde jedoch nicht ausreichen, einfach auf das Loaded-Event in der MainPage zu reagieren. Was passiert, wenn - widererwartend - Load schneller fertigt ist, als ich im Konstruktor von MainPage das Event zuweien kann?

    Btw. gibt es gar kein Loaded Event 😉


Anmelden zum Antworten