事件或动作<>方法完成?

时间:2011-10-29 09:33:07

标签: wpf events asynchronous delegates prism

假设您有一个电子邮件文件夹和邮件。每条消息都有Body属性,需要加载异步并在完成后通知您,您将如何处理此问题?

1 - Message.LoadBody()+事件Message.BodyLoadComplete

2 - Message.LoadBody(Action completeDelegate)

为了完整起见,WPF和Prism都参与其中。

谢谢!

编辑:

消息将是一个UI实体,它将包装IMessage接口(不是UI Ready(没有INPC)),所以我要问的是我们必须解决UI和业务层之间的接口问题.. IMessage。 (业务层将使用已经具有某种异步模式的Imap库,但我们不想过多地依赖任何imp,这就是为什么我试图找出最佳接口.. < / p>

3 个答案:

答案 0 :(得分:3)

如果您使用的是.NET 4,我会使用:

Task<string> LoadBodyAsync()

(您可能希望使用TaskCompletionSource<TResult>实现此目的。)

然后调用者可以添加延续等但是他们希望......最重要的是,在.NET 4.5和C#5这个勇敢的新世界中,这将与async / await无缝协作特征

答案 1 :(得分:1)

你的两个选择:

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

// or ...

Message.LoadBody(Action completeDelegate)

事件选项更灵活,有时可能不那么痛苦。如果您不关心何时或LoadBody完成,那么您不会被迫提供虚假的回调。您可以将完成事件绑定到多个事件处理程序,这有时可能很有用(例如,如果需要更新多个UI控件)。

但是,您的解决方案都是非典型的。典型的“旧”方法是将LoadBody拆分为BeginLoadBodyEndLoadBody,并为用户提供IAsyncResult。见this article。 Jon Skeet的回答概述了典型的“新”方式。

答案 2 :(得分:0)

如果您正在使用Prism,则应考虑使用EventAggregator并发布消息以指示邮件已加载。这将允许您轻松地为此“事件”拥有多个松散耦合的订阅者。

使用EventAggregator是发布事件的优雅解决方案,可以实现更清晰,更分离的架构,更易于扩展。例如,如果您希望为电子邮件加载添加新功能(例如进度指示),您只需订阅EmailLoaded消息即可完成,您无需将新组件与电子邮件紧密联系在一起通过事件或回调,他们不需要彼此了解。