链式异步/事件调用是否有一个有用的设计模式?

我目前不得不在Silverlight中集成大量的Web服务调用,这些调用类似于下面的代码。 在完成所有3的加载之前,不可能进行任何用户交互。

// In my view, having standard delegate methods (non-anonymous) makes the // code below even messier. // I've left out the EventArgs to shorten the example however // I usually use these objects in the delegate method. MyService1 service1 = new MyService1(); service1.GetAllUsersCompleted += delegate { MyService2 service2 = new MyService2(); service2.AnotherTaskCompleted += delegate { MyService3 service3 = new MyService3(); service3.YetAnotherTaskCompleted += delegate { // etc. }; service3.YetAnotherTask(); }; service2.AnotherTask(); }; service1.GetAllUsers(); 

本质上我希望调用是同步的,但是由于Silverlight中的Web服务代理类的体系结构(一切都是事件驱动的)我不能这样做。

我的问题是,是否有一个更优雅的解决方案或可能是一个以.NET为中心的设计模式,用于重构我从一个委托方法调用另一个方法,调用另一个方法,变成更容易管理的东西?

我在代码中遇到的最大问题之一是在委托中的大部分工作之后发生的实际方法调用。

好吧,我建议首先通过同时运行所有三个调用来利用Silverlight的异步特性,如果可能的话。

您可以使用任务(特别是任务延续)“按顺序”执行此操作,但您可能还需要查看Rx库 ,该库旨在优雅地处理此类情况。

另一个最后提示:不建议禁止用户交互。 至少让他们选择取消操作。

我认为这是新任务(在并行库中)类尝试抽象,但我可能是错的:)

我可能在这里错了,但不是代表已经同步。 您可以使用BeginInvoke方法使它们异步。 这是同步和异步方法调用的一个很好的资源,并解释了一些模式等.http://support.microsoft.com/kb/315582

文章的标题可能是如何异步调用Visual C#方法,但有一半的同步方法调用的例子。