2012-06-01 21 views
2

對不起,如果標題有點不倫不類,我真的不能說得對。下載時更新對話窗體

基本上,我有如下的場景:

我有一個用戶界面(WinForm的),允許用戶選擇多個文件下載,然後點擊「下載」按鈕開始下載。所有的下載都是異步處理的,以避免鎖定表單。但是,雖然我不希望表單鎖定「Not Responding」消息,但我也不希望用戶能夠在下載運行時修改表單字段。

理想情況下,我想生成一個模式對話框,讓用戶知道下載的狀態(即類似於firefox,除了模態對話框)。這樣一舉兩得,因爲它讓用戶能夠很好地瞭解下載進度,同時還可以在對話框處於活動狀態時阻止用戶與父窗體進行交互。

但是,爲了讓用戶瞭解下載進度,我需要在運行時更新對話框。這是我撞牆的地方。我目前的想法是公開一些我的對話類的公共方法,當文件完成時發送它的更新,並從後臺下載線程(與適當的代表更新控件等)調用它們。

我很確定這會按我的意願工作,但我只是想知道是否有更好的解決方案來解決這個問題。不要只侷限於對話方式,我願意接受所有可能提供更好選擇的方法。

乾杯, Ĵ

回答

1

替代1

您可以考慮使用BackgroundWorker,將採取設置一個新的線程來完成這項工作,並提供基於事件的機制,以報告進展情況,並一種請求取消操作的方法(如果您想使用它,則由您決定)。

要爲您的BackgroundWorker設置任務,您需要附加處理程序到事件DoWork,然後撥打RunWorkerAsync()

替代2

另一種方法是使用IObservable<T>建立一種機制,以對下載的進度作出反應,那麼你可以做用Reactive結合。

我帶你是新來的反應。在這種情況下,這是現有的最佳介紹(在我看來):

http://channel9.msdn.com/Blogs/codefest/DC2010T0100-Keynote-Rx-curing-your-asynchronous-programming-blues


如果你有自由,不是禁用UI,你大概進度報告在狀態欄,或者專門提供一個輔助表格(您可以讓用戶關閉並返回NotifyIcon),您可以在這裏獲得當前和任何未完成的作品。

+0

這是要求在下載過程中禁用UI,所以沒有太多的靈活空間。當下載完成異步時,我已經有了一個通知事件,我的問題更多地是處理這種情況的最佳方法。 –

+0

剛剛讀過IObserver/IObservable接口,他們看起來像他們可能適合我的想法。謝謝! –

+0

@JasonLarke花時間,並檢查我鏈接的視頻。這是值得的。 – Theraot