событие или действие <> по методу завершено? - PullRequest
1 голос
/ 29 октября 2011

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

1 - Message.LoadBody () + событие Message.BodyLoadComplete

2 -Message.LoadBody (Action completeDelegate)

Ради полноты участвуют WPF и Prism.

Спасибо!

Редактировать:

Сообщение будетОбъект пользовательского интерфейса, который обернет интерфейс IMessage (который не готов к UI (нет INPC)), поэтому я спрашиваю, почему мы должны согласиться на интерфейс между пользовательским интерфейсом и бизнес-уровнем ... IMessage.(Бизнес-уровень будет использовать библиотеку Imap, которая уже имеет некоторый асинхронный шаблон, но мы не хотим слишком сильно зависеть от какого-либо импа, поэтому я пытаюсь выяснить лучший интерфейс ..

Ответы [ 3 ]

3 голосов
/ 29 октября 2011

Если вы используете .NET 4, я бы использовал:

Task<string> LoadBodyAsync()

(Вы можете реализовать это, используя TaskCompletionSource<TResult>.)

Затем вызывающий абонент может добавлять продолжения и т. Д. По своему усмотрению ... и, что наиболее важно, в новом дивном мире .NET 4.5 и C # 5 это будет беспрепятственно работать с функциями async / await.

1 голос
/ 29 октября 2011

Из двух ваших вариантов:

Message.LoadBody() // Plus an event, Message.BodyLoadComplete

// or ...

Message.LoadBody(Action completeDelegate)

Параметр события является более гибким и иногда может быть менее болезненным в использовании. Если вас не волнует, когда или если LoadBody завершится, вы не обязаны предоставлять фальшивый обратный вызов. И вы можете привязать событие завершения к нескольким обработчикам событий, что иногда может быть полезно (например, если необходимо обновить несколько элементов управления пользовательского интерфейса).

Однако оба ваших решения нетипичны. Типичный «старый» способ сделать это - разделить LoadBody на BeginLoadBody и EndLoadBody и дать пользователю IAsyncResult. См. эту статью . Типичный «новый» способ сделать это изложен в ответе Джона Скита.

0 голосов
/ 29 октября 2011

Если вы используете Prism, вам следует рассмотреть возможность использования EventAggregator и публикации сообщения, указывающего на загрузку почты. Это позволит вам легко иметь несколько слабосвязанных подписчиков для этого «события».

Использование EventAggregator - это элегантное решение для публикации событий, которое ведет к гораздо более чистой и отделенной архитектуре, которую легче расширять. Например, если вы хотите добавить в загрузку электронной почты новую функцию, такую ​​как индикация хода выполнения, вы можете просто подписаться на сообщение EmailLoaded и все готово, вам не нужно жестко связывать новый компонент с электронными письмами через событие или обратный вызов, они не должны знать друг о друге.

...