Порядок вызова асинхронных методов в c # - PullRequest
1 голос
/ 07 мая 2010

скажем, у меня 4 класса

  • ControllerClass
  • MethodClass1
  • MethodClass2
  • MethodClass3

и каждый MethodClass имеет асинхронный метод DoStuff (), и у каждого есть CompletedEvent.

ControllerClass отвечает за вызов 3 асинхронных методов для 3 MethodClasses в определенном порядке .

Таким образом, ControllerClass вызывает MethodClass1.DoStuff () и подписывается на MethodClass1.CompletedEvent. Когда это событие запускается, ControllerClass вызывает MethodClass2.DoStuff () и подписывается на MethodClass2.CompletedEvent. Когда это событие запускается, ControllerClass вызывает MethodClass3.DoStuff ()

Есть ли лучшая практика для такой ситуации? Это плохой дизайн?

Я верю, что это потому, что

  • Мне трудно пройти юнит-тест (верный признак)
  • Изменить заказ нелегко
  • У меня неприятное чувство обоняния по этому поводу

Каковы альтернативы в такой ситуации?

Примечание. Я нацеливаюсь на платформу .NET 2.0

Ответы [ 5 ]

1 голос
/ 07 мая 2010

Если у вас есть доступ к коду классов, которые вы вызываете, а также у вас есть свобода изменять его, почему бы не обернуть его в обработчик (реализующий шаблон цепочки ответственности). Затем вы можете определить преемника для каждого метода. Это снизит сложность и повысит гибкость.

1 голос
/ 07 мая 2010

У Джеффа Рихтера есть отличная статья об использовании перечислителей для упрощения кода APM. Microsoft CCR также использует похожую технику. Стоит исследовать:

http://msdn.microsoft.com/en-us/magazine/cc546608.aspx

0 голосов
/ 07 мая 2010

Нет смысла делать это таким образом. Вызовите one вспомогательный метод асинхронно. Он должен вызывать три метода, которые вы сейчас запускаете асинхронно. Последовательность их теперь проста, и вам нужно беспокоиться только об одном асинхронном методе. Более эффективно, вы больше не запускаете и не переключаетесь между потоками. На самом деле это занимает меньше времени.

0 голосов
/ 07 мая 2010

Поскольку три метода, которые вы используете, необходимо запускать в определенном порядке, и они должны ждать друг друга, почему вы не хотите вызывать их асинхронно? Просто делайте простые синхронные звонки.

0 голосов
/ 07 мая 2010

Какую версию .NET мы используем?В .NET 4.0 есть класс Task, который вы можете использовать для запуска задач и очень простого изменения порядка.

Хороший пример здесь: http://blogs.msdn.com/pfxteam/

Вы можете увидеть, как выможет ставить в очередь задачи.

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