【问题标题】:How to Await F# Async Code Method from C# ( WPF )如何从 C# ( WPF ) 等待 F# 异步代码方法
【发布时间】:2022-08-02 14:33:07
【问题描述】:

我用 F# 编写大部分后端代码 - 但我的 WPF 项目是用 C# 编写的,我正在处理进程和 UI 之间的进度报告。

我的 F# 代码

type DownloadProgressModel = {
        mutable PercentageComplete: int
        totalOrders: int
        mutable orderPosition: int
    }

let doMockDownload(progress: IProgress<DownloadProgressModel>) = async {
        let downloadprogress: DownloadProgressModel = {
            PercentageComplete = 0
            totalOrders = 20
            orderPosition = 0
        }
        for i in [0..20] do
            do! Async.Sleep(2000)
            downloadprogress.orderPosition <- i
            downloadprogress.PercentageComplete <- (i*100) / 20
            progress.Report(downloadprogress)
        return \"Finished\"
    }

我的 C# 从 WPF 视图调用代码

private async void SimpleButton_Click(object sender, RoutedEventArgs e)
        {
            Progress<DownloadProgressModel> progress = new Progress<DownloadProgressModel>();
            progress.ProgressChanged += Progress_ProgressChanged;
            var a = await MockDownload.doMockDownload(progress);
        }

        private void Progress_ProgressChanged(object sender, DownloadProgressModel e)
        {
            ordersProgress.Value = e.PercentageComplete;
        }

我收到以下错误:(违规行 var a = await MockDownload.doMockDownload(progress); )

\'FSharpAsync\' 不包含 \'GetAwaiter\' 的定义 并且没有可访问的扩展方法 \'GetAwaiter\' 接受第一个 可以找到类型为 \'FSharpAsync\' 的参数(您是否缺少 using 指令或程序集引用?)

这大致基于 C# 高级异步 - 获取进度报告、取消任务等,由 youtube 上的 \"IamTimCorey\" 提供 - 但这都是 C#。

    标签: asynchronous f#


    【解决方案1】:

    F# async 计算表达式与 C# async 关键字不直接兼容。对于您控制的代码,这意味着从 C# 中使用,您可能最好切换到 task computation expression instead

    或者,您可以使用Async.StartAsTaskAsync&lt;'T&gt; 转换为Task&lt;'T&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      相关资源
      最近更新 更多