假设您有一个电子邮件文件夹和邮件。每条消息都有Body属性,需要加载异步并在完成后通知您,您将如何处理此问题?
1 - Message.LoadBody()+事件Message.BodyLoadComplete
2 - Message.LoadBody(Action completeDelegate)
为了完整起见,WPF和Prism都参与其中。
谢谢!
编辑:
消息将是一个UI实体,它将包装IMessage接口(不是UI Ready(没有INPC)),所以我要问的是我们必须解决UI和业务层之间的接口问题.. IMessage。 (业务层将使用已经具有某种异步模式的Imap库,但我们不想过多地依赖任何imp,这就是为什么我试图找出最佳接口.. < / p>
答案 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
拆分为BeginLoadBody
和EndLoadBody
,并为用户提供IAsyncResult
。见this article。 Jon Skeet的回答概述了典型的“新”方式。
答案 2 :(得分:0)
如果您正在使用Prism,则应考虑使用EventAggregator并发布消息以指示邮件已加载。这将允许您轻松地为此“事件”拥有多个松散耦合的订阅者。
使用EventAggregator是发布事件的优雅解决方案,可以实现更清晰,更分离的架构,更易于扩展。例如,如果您希望为电子邮件加载添加新功能(例如进度指示),您只需订阅EmailLoaded
消息即可完成,您无需将新组件与电子邮件紧密联系在一起通过事件或回调,他们不需要彼此了解。