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

时间:2010-07-19 10:46:44

标签: c# design-patterns delegates anonymous-methods

我目前不得不在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为中心的设计模式,用于重构我从一个委托方法调用另一个方法,调用另一个方法,变成更容易管理的东西?

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

3 个答案:

答案 0 :(得分:2)

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

你可以“按顺序”执行任务(特别是任务延续),但你可能还想查看Rx library,它旨在优雅地处理这种情况。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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