C#async / await方法到F#?

时间:2016-11-01 11:05:44

标签: f# c#-to-f#

我正在尝试学习F#,并且正在将一些C#代码转换为F#。

我有以下C#方法:

public async Task<Foo> GetFooAsync(byte[] content)
{
    using (var stream = new MemoryStream(content))
    {
        return await bar.GetFooAsync(stream);
    }
}

bar是某个私人字段,GetFooAsync返回Task<Foo>

这如何转化为F#?

以下是我目前的情况:

member public this.GetFooAsync (content : byte[]) = 
    use stream = new MemoryStream(content)
    this.bar.GetFooAsync(stream)

返回Task

2 个答案:

答案 0 :(得分:11)

在F#中,异步由async计算构建器表示,它不是Task的精确模拟,但通常可以用来代替一个:

member public this.GetFooAsync (content : byte[]) = 
   async {
      use stream = new MemoryStream(content) 
      return! this.bar.GetFooAsync(stream) |> Async.AwaitTask
   } 
   |> Async.StartAsTask

答案 1 :(得分:5)

如果您要将async / await密集型C#代码转换为F#,由于F#asyncTask之间存在差异,以及你总是要打电话给Async.AwaitTask

为避免这种情况,您可以使用具有task计算表达式的FSharpx库。

let tplAsyncMethod p = Task.Run (fun _ -> string p)

// awaiting TPL method inside async computation expression
let asyncResult = async {
                   let! value1 = tplAsyncMethod 1 |> Async.AwaitTask
                   let! value2 = tplAsyncMethod 2 |> Async.AwaitTask
                   return value1 + value2
                }

// The same logic using task computation expression
open FSharpx.Task
let taskResult = task {
                    let! value1 = tplAsyncMethod 1
                    let! value2 = tplAsyncMethod 2
                    return value1 + value2
                }

asyncResult的结果为Async<string>taskResult的结果为Task<string>