2009-07-08 111 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线程显示了一些更多的细化到“同步”异步调用的问题。

相关问题