2014-07-20 112 views
3

我有一個下載網站的功能:F#異步和WPF進度

let downloadPage (address : string) = 
    async 
     { 
      // do some magic here 
     } 

它的類型是「字符串 - >異步串」。

我想下載幾個頁面 - 讓「pagesToDownload」是一個包含所有這些頁面的seq。然後我可以這樣寫:

pagesToDownload 
|> Seq.map downloadPage 
|> Async.Parallel 
|> Async.RunSynchronously 

這很好,但它需要一些時間來完成。我打算在我的用戶界面中使用這個功能,所以很高興提供例如一個ProgressBar。

我發現在WPF使用進度一篇好文: http://elegantcode.com/2009/07/03/wpf-multithreading-using-the-backgroundworker-and-reporting-the-progress-to-the-ui/

,但我看不出這兩個想法結合起來。下載網站的模塊使用F#編寫,UI(ViewModel和View)使用C#編寫。

+0

您可以接受['IProgress '](http://msdn.microsoft.com/en-us/library/hh138298%28v=vs.110%29.aspx)並使用默認['進度' ](http://msdn.microsoft.com/zh-cn/library/hh193692%28v=vs.110%29.aspx)實現作爲下載一堆頁面的方法中的參數。 –

回答

2

處理此問題的一個簡單方法是使用FSharp.ViewModule's Progress支持。它包含一個ProgressManager類,它提供了一個功能樣式API來更新進度,並在內部爲您包裝Progress<T>

這使得直接從WPF UI進行綁定變得非常簡單。有關示例,請參閱Visual F# Power Tools Rename dialog。只要確保在主線程/ SynchronizationContext中的VM中創建實例,它就會「正常工作」。 (這通常意味着在ViewModel類型中將其設置爲let綁定或類似模式。)

如果您不想承擔FSharp.ViewModule的依賴關係(如果您願意,我建議並建議它是值得的使用F#爲WPF支持的MVVM ViewModels),您可以輕鬆地將上面鏈接的代碼調整爲您的場景。

+0

謝謝里德,不幸的是這兩個鏈接都被破壞了。你會有其他的例子嗎? – Goswin

+0

@Goswin我只是修復了鏈接:) –