我正在尝试学习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
。
答案 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#async
和Task
之间存在差异,以及你总是要打电话给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>
。