wpf - F# 异步和 WPF 进度条

标签 wpf asynchronous mvvm f# progress-bar

我有一个下载网站的函数:

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

它的类型是“string -> Async string”。

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

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

这很好用,但是需要一些时间才能完成。我打算在我的用户界面中使用这个功能,所以最好提供例如进度条。

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

最佳答案

一个简单的处理方法是使用 FSharp.ViewModule's Progress支持。它包括一个 ProgressManager类,它提供了一个函数式风格的 API 来更新进度,并在内部包装了一个 Progress<T>为你。

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

如果您不想承担 FSharp.ViewModule 的依赖关系(如果您将 F# 用于 WPF 支持的 MVVM ViewModel,我建议并建议这是值得的),您可以轻松地将上面链接的代码调整为您的场景。

关于wpf - F# 异步和 WPF 进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24855156/

相关文章:

c# - 如何在 WPF 中实现圆锥形/圆锥形/圆形渐变

node.js - Node.js 回调后会继续执行语句吗?

javascript - 使用 AJAX 在 javaScript 中接收到错误数据

Wpf 内容控制

wpf - 如何在 WPF 中使用动态 URL 绑定(bind)到图像?

c# - 如何模拟 Application.Current 进行单元测试?

javascript - C# "event loop"与 JavaScript "event loop"相比如何?

android - onClick 在 android 数据绑定(bind)中的 mvvm 中不起作用

c# - 如何创建具有只能具有特定值的属性的对象

wpf - 大声说 “ModelViewViewModel”或 “MVVM”太尴尬了!备择方案?