F#Async和WPF ProgressBar

时间:2014-07-20 21:39:34

标签: wpf asynchronous mvvm f# progress-bar

我有一个下载网站的功能:

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

它的类型是"字符串 - >异步字符串"。

我想下载几个页面 - 让#34; pagesToDownload"是一个包含所有这些的seq。然后我可以写:

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

这很好用,但需要一些时间才能完成。我计划在我的UI中使用此功能,因此提供例如一个ProgressBar。

我发现了一篇关于在WPF中使用ProgressBar的好文章: http://elegantcode.com/2009/07/03/wpf-multithreading-using-the-backgroundworker-and-reporting-the-progress-to-the-ui/

但我无法看到如何将这两种想法结合起来。下载网站的模块是用F#编写的,而UI(ViewModel和View)是用C#编写的。

1 个答案:

答案 0 :(得分:3)

处理此问题的一种简单方法是使用FSharp.ViewModule's Progress支持。它包含一个ProgressManager类,它提供了一个功能样式API来更新进度,并在内部为您包装Progress<T>

这使得直接从WPF UI绑定变得简单。有关示例,请参阅Visual F# Power Tools Rename dialog。只需确保在主线程/ SynchronizationContext上的VM中创建实例,然后它就会工作&#34;。 (这通常意味着在ViewModel类型中以let绑定或类似方式构建它。)

如果您不想接受FSharp.ViewModule的依赖关系(如果您使用F#为WPF支持的MVVM ViewModel,我推荐和建议是值得的),可以轻松地将上面链接的代码调整到您的方案中。