Как выполнить асинхронные операции последовательно? - PullRequest
9 голосов
/ 15 февраля 2011

Теперь я использую что-то похожее на эту конструкцию

A.Completed += () =>
{ B.Completed += () =>
  {  C.Completed += () =>
     {
       //
     }
     C();
   }
   B();
 }  
 A();

И не очень доволен этим. Есть ли лучший, более чистый способ выполнить такое последовательное / параллельное выполнение действий?

Я смотрю на платформу Rx, но она предназначена для других задач и выглядит слишком излишне для моей проблемы.

Ответы [ 5 ]

8 голосов
/ 15 февраля 2011

Нет необходимости вкладывать настройки завершенных событий, если только кто-то не может вызвать B или C до завершения A. Если вы выделите его, вот как это выглядит:

A.Completed += () => { B(); };
B.Completed += () => { C(); };  
C.Completed += () => { //   }; 

A();

Я думаю, что удаление вложенности делает его намного чище.

4 голосов
/ 15 февраля 2011

Посмотрите на ReactiveUI . Он основан на Rx и значительно упростит ваш код. Вот пример: Вызов веб-служб в Silverlight с использованием ReactiveXaml

2 голосов
/ 15 февраля 2011

Вы можете взглянуть на TPL.Вы можете написать код, как в этой теме: ссылка

1 голос
/ 15 февраля 2011

Дождитесь C # 5.0 и используйте новые ключевые слова async и await.

Вот несколько предварительных ссылок по этому поводу:

1 голос
/ 15 февраля 2011

Это не намного чище, но вы можете взглянуть на BackgroundWorker.

BackgroundWorker A = new BackgroundWorker();
A.DoWork += (s, e) => AMethod();
A.RunWorkerCompleted += (s, e) => BMethod();

BackgroundWorker B = new BackgroundWorker();
B.RunWorkerCompleted += (s, e) => CMethod();

//etc

Вы на самом деле не слишком сокращаете код, но я бы сказал, что он намного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...