Silverlight 2如何知道所有ASYNC WCF调用已完成

时间:2009-07-08 14:45:16

标签: silverlight asynchronous

工具:SilverLight 2,C#3.5,VS2008和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);

有什么想法吗?

4 个答案:

答案 0 :(得分: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.
}

希望它有所帮助。

答案 1 :(得分:2)

与雅各布相似,把它抽象成一个单独的类。这至少可以简化您的调用类并消除加入调用的复杂性。

在您的课程中,简单地说就是来自异步调用的每个已完成事件,检查已完成的事件数量,如果它与总数匹配,则触发您自己的已完成事件。有点像这样:

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);
     }

  }

}

答案 2 :(得分:0)

假设在等待时无法再次调用这些调用,您可以为每个服务添加一个Completed处理程序。在每个处理程序中,您可以为该调用设置一个标志,并检查是否已设置所有三个标志。如果是,则转到主屏幕。

答案 3 :(得分:0)

设置标志肯定是一个有用的解决方案,但this线程显示了一些更精确的方法来解决“同步”异步调用的问题。