2011-10-29 20 views
1

假設你有一個電子郵件文件夾和郵件。每條消息都有Body屬性,需要加載異步並在完成後通知您,您將如何處理這個問題?事件或Action <>方法完成?

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

2 - Message.LoadBody(動作completeDelegate)

爲了完整性WPF和棱鏡涉及的緣故。

謝謝!

編輯:

消息將是這將保鮮膜即時聊天界面(即不UI準備(沒有INPC)),所以我要問的原因是我們不得不接受的界面UI實體UI和業務層之間.. IMessage。 (業務層將使用已經有一些異步模式的Imap庫,但我們不想過多依賴任何imp,這就是爲什麼我試圖找出最好的接口..

+0

一個更具描述性和開放性的標題可能是「異步方法的最佳模式?「 –

+0

即時通訊不討論異步模式,再加上像它總是結束於」取決於你在做什麼「 – Zapacila

回答

3

如果您正在使用.NET 4,我會使用:

Task<string> LoadBodyAsync() 

(您可能要實現這個使用TaskCompletionSource<TResult>。)

主叫方可以再添加延續等但是他們希望...最重要的是,在.NET 4.5和C#5這個勇敢的新世界中,這將與async/await功能無縫協作。

+0

內部負載體另一個imap庫被稱爲執行加載在另一個線程,所以使用任務是我的第一個想法,但在這種情況下,這不是一個真正的選擇.. – Zapacila

+0

@Zapacila:爲什麼不呢?說「這不是一個選項」並不能提供太多的信息 –

+0

@Joe會有2個線程由任務創建, inap庫.. – Zapacila

1

您兩種選擇:

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

// or ... 

Message.LoadBody(Action completeDelegate) 

事件選項更加靈活,且有時可以使用更少的痛苦。如果您不在乎何時或如果LoadBody完成,那麼您不必強制提供假回叫。您可以將完成事件綁定到多個事件處理程序,有時可能會有用(例如,如果需要更新多個UI控件)。

雖然這兩種解決方案都不是典型的。典型的「舊」方法是將LoadBody拆分爲BeginLoadBodyEndLoadBody,並給予用戶IAsyncResult。見this article。在Jon Skeet的回答中列出了典型的「新」方法。

0

如果您使用Prism,則應考慮使用EventAggregator併發布消息以指示已加載郵件。這將使您可以輕鬆地爲此「事件」提供多個鬆散耦合的訂閱者。

使用EventAggregator是一個用於發佈事件的優雅解決方案,並且導致更容易擴展的更清潔和分離的體系結構。例如,如果您希望爲電子郵件加載添加新功能(如進度指示),則只需訂閱EmailLoaded消息即可完成,無需通過事件緊密地將新組件與電子郵件連接起來,或者回調,他們不需要了解對方。

相關問題