工具: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);
有什么想法吗?
答案 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线程显示了一些更精确的方法来解决“同步”异步调用的问题。