2009-07-08 5 views
2

Werkzeuge: Silverlight 2, C# 3.5, VS2008 und WCF Async ProgrammierungSilverlight 2 Wie kann man wissen alle ASYNC WCF Anrufe abgeschlossen ist

In meiner SL2-Anwendung, ich mache 3 async wcf Anrufe wie folgt -

void HomeScreen() 
{ 

//Async WCF Calls 
DataService.GetPersonInfo(sUser); 
DataService.GetSalaryInfo(sUser); 
DataService.GetDepartmentInfo(sUser); 

//Where to put this code? 
//Page.Redirect("MainScreen"); 

} 

Nachdem alle 3 Async-Aufrufe abgeschlossen wurden, muss ich Benutzer auf einen MainScreen verschieben. Woher weiß ich, dass alle 3 Async-Anrufe abgeschlossen wurden?

(ohne Schleife mit globalen Variable für asynchrones Verfahren Status zu überprüfen)

Does SL2 hat jede eingebaute Funktion wie JQuery alle Asynchron-Anruf zu wissen, hat für Ex abgeschlossen -

$().ajaxStop($.unblockUI); 

Irgendwelche Gedanken?

+0

Ich glaube nicht, dass es einen eingebauten Anruf wie die Jquery, die Sie geschrieben haben, gibt; Sie müssen eine Problemumgehung wählen. –

Antwort

0

Vorausgesetzt, dass diese Anrufe nicht erneut ausgeführt werden können, während Sie warten, können Sie einfach einen Abgeschlossenen Handler für jeden der Dienste hinzufügen. In jedem Handler könnten Sie ein Flag für diesen Aufruf setzen und prüfen, ob alle drei Flags gesetzt wurden. Wenn ja, dann gehe zum Hauptbildschirm.

2

Ähnlich wie Jacob, abstrahieren Sie dies in eine separate Klasse. Dies wird Ihre Anrufklasse zumindest vereinfachen und die Komplexität des Beitritts der Anrufe beseitigen.

In Ihrer Klasse, in den einfachsten Begriffen einfach für jedes abgeschlossene Ereignis aus dem Async-Aufruf, überprüfen Sie, wie viele Ereignisse abgeschlossen sind, wenn es mit der Summe übereinstimmt, feuern Sie ein abgeschlossenes Ereignis aus. Somethign wie folgt aus:

public class DataProvider() 
{ 
    private int callCount = 0; 

    public event EventHandler Completed; 
    public void Go() 
    { 
    callCount = 0; 
    //Async WCF Calls 
    DataService.GetPersonInfo(sUser); 
    DataService.GetSalaryInfo(sUser); 
    DataService.GetDepartmentInfo(sUser); 
    } 

    public void GetSalaryInfoCompleted(object sender, SomeArgs e) 
    { 
    //Do something with the results here 
    CheckIfCompleted(); 
    } 
    public void GetDepartmentInfoCompleted(object sender, SomeArgs e) 
    { 
    //Do something with the results here 
    CheckIfCompleted(); 
    } 

    public void GetPersonInfoCompleted(object sender, SomeArgs e) 
    { 
    //Do something with the results here 
    CheckIfCompleted(); 
    } 

    private void CheckIfCompleted() 
    { 
    callCount++; 
    if (callCount == 3) 
    { 
     Completed(this, EventArgs.Empty); 
    } 

    } 

} 
+0

Ich verwendete dies, um zu warten, dass sowohl ein asynchroner Dienstanruf als auch eine Animation beendet wurde. Beide Ereignishandler rufen die Methode auf, die überprüft, ob beide beendet sind, bevor das nächste Ereignis ausgelöst wird. Hut ab! –

4
DataService.GetPersonInfo(sUser, (result) => 
{ 
    DataService.GetSalaryInfo(sUser, 
     (result) => 
     { 
     DataService.GetDepartmentInfo(sUser, (result) => 
      { 
       Page.Redirect("MainScreen"); 
      } 
     ); 
     } 
    ); 
} 
); 

Aber Ihre GetPersonInfo Methode haben, es zu ändern, wie

GetPersonInfo(user, Action<bool> complete){ 
    //And call complete.Invoke(true); or false based on completing of the processs. 
} 

Hoffe, es hilft.

+0

oh. Rich Text Editor hier entfernen \ n :( –

0

Setzen von Flags ist sicherlich eine sinnvolle Lösung, aber this Thread zeigt einige mehr verfeinert approches auf das Problem der "synchronen" asynchronen Aufrufe.

Verwandte Themen