Есть ли полезный шаблон проектирования для связанных асинхронных вызовов / вызовов событий? - PullRequest
2 голосов
/ 19 июля 2010

В настоящее время мне нужно интегрировать множество вызовов веб-служб в Silverlight, которые выполняют вызовы, подобные приведенному ниже коду. Взаимодействие с пользователем не должно быть возможным, пока загрузка всех 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 (все управляется событиями) я не могу этого сделать.

У меня вопрос: есть ли более элегантное решение или, возможно, шаблон для разработки, ориентированный на .NET, для рефакторинга того, что у меня есть, от одного метода делегата, вызывающего другой метод, вызывающего другой, к чему-то, чем легче управлять?

Одна из моих самых больших проблем с кодом - фактический вызов метода происходит после основной работы делегата.

Ответы [ 3 ]

2 голосов
/ 19 июля 2010

Ну, во-первых, я бы порекомендовал вам воспользоваться асинхронной природой Silverlight, выполнив все три вызова одновременно, если это возможно.

Вы можете сделать это «последовательно» с задачами (в частности, с продолжениями задач), но вы также можете посмотреть на Rx библиотеку , которая предназначена для изящной обработки подобных ситуаций. 1005 *

Еще один последний совет: запрещать взаимодействие с пользователем не рекомендуется. По крайней мере, дайте им возможность отменить операцию.

1 голос
/ 19 июля 2010

Я думаю, это то, что новые классы Tasks (в библиотеке Parallel) пытаются абстрагировать, но я могу ошибаться:)

0 голосов
/ 19 июля 2010

Я могу ошибаться, но делегаты уже не синхронны. Вы можете сделать их асинхронными, используя метод BeginInvoke. Вот хороший ресурс для синхронных и асинхронных вызовов методов и объясняет некоторые шаблоны и т. Д. http://support.microsoft.com/kb/315582

Название статьи может быть «Как вызывать метод Visual C # асинхронно, но есть примеры синхронных вызовов методов примерно на полпути.

...