2

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

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

4

3 回答 3

2

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

您可以对任务(尤其是任务延续)“按顺序”执行此操作,但您可能还想查看Rx 库,它旨在优雅地处理这种情况。

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

于 2010-07-19T11:19:51.727 回答
1

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

于 2010-07-19T10:48:28.340 回答
0

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

文章的标题可能是 How to call a Visual C# method asynchronously,但有大约一半的同步方法调用示例。

于 2010-07-19T10:57:55.967 回答