2009-07-08 43 views
2

工具:Silverlight 2中,C#3.5,VS2008和WCF 異步編程Silverlight 2中如何知道所有異步WCF調用已完成

在我SL2的應用程序,我想提出3異步WCF調用如下 -

void HomeScreen() 
{ 

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

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

} 

畢竟3個異步調用完成後,我需要將用戶移動到MainScreen。 我如何知道所有3個異步調用都已完成?

(不使用循環來檢查異步方法狀況的全球 變量)

不SL2有任何內置的功能,如jQuery知道所有的異步調用已完成 爲前 -

$().ajaxStop($.unblockUI); 

有什麼想法?

+0

我不認爲有像你寫的JQuery一樣的內置調用;您必須選擇一種解決方法。 – 2009-07-09 12:14:11

回答

0

假設這些調用在等待時不能再次進行,您可以爲每個服務添加一個Completed處理程序。在每個處理程序中,您可以爲該調用設置一個標誌,並檢查是否所有三個標誌都已設置。如果是這樣,那麼轉到主屏幕。

2

類同雅各摘要擄到一個單獨的類。這至少可以簡化您的呼叫類,並消除加入呼叫的複雜性。

在你的課堂中,用最簡單的術語簡單地說明異步調用中每個完成的事件,檢查已完成的事件數量,如果匹配總數,則觸發你自己完成的事件。 Somethign這樣的:

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

我用它來實現等待異步服務調用和動畫完成。兩個事件處理程序都會調用在觸發下一個事件之前檢查它們是否都完成的方法。榮譽給你! – 2011-10-12 19:41:56

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

但是你GetPersonInfo方法將不得不改變它像

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

希望它能幫助。

+0

哦。富文本編輯器在這裏刪除\ n :( – 2009-07-09 02:54:05

0

設置標誌當然是一個有用的解決方案,但this線程顯示了一些更多的細化到「同步」異步調用的問題。

相關問題