【问题标题】:F# Async and WPF ProgressBarF# 异步和 WPF 进度条
【发布时间】:2014-07-20 21:39:34
【问题描述】:

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

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

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

我想下载几个页面 - 让“pagesToDownload”成为包含所有页面的序列。然后我可以写:

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

这工作正常,但需要一些时间才能完成。我打算在我的 UI 中使用这个功能,所以最好提供例如进度条。

我发现了一篇关于在 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# 编写的。

【问题讨论】:

标签: wpf asynchronous mvvm f# progress-bar


【解决方案1】:

处理此问题的一种简单方法是使用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,我建议并建议这样做是值得的),您可以轻松地将上面链接的代码修改为你的场景。

【讨论】:

  • 感谢 Reed,很遗憾这两个链接都已损坏。你还有其他例子吗?
  • @Goswin 我刚刚修复了链接 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多