实现C#方法返回F#中的Task

我在F#中创建了一个inheritance自C#类的类型,该类公开了一个在C#中返回Task的方法。 我正在尝试找出在F#中做到这一点的最佳方式

说我的C#看起来像这样:

 public class Foo { public TextWriter Out { get { return Console.Out; } } public virtual Task DoStuff() { return Task.FromResult(SomeEnum.Foo); } } public enum SomeEnum { Foo, Bar } 

我在F#中inheritance该类型的第一步看起来像这样:

 type Bar() = inherits Foo() override this.DoStuff() = this.Out.WriteLineAsync("hey from F#") |> ignore System.Threading.Task.FromResult(SomeEnum.Bar) 

但是a)它不觉得它实际上是异步的并且b)它只是感觉不是-F#。

那么我将如何inheritanceFoo类并实现期望返回TaskDoStuff方法?

您可以使用Async.StartAsTask :

 type Bar() = inherit Foo() override this.DoStuff() = async { return SomeEnum.Bar } |> Async.StartAsTask 

Async.StartAsTaskAsync作为输入,并返回Task

执行异步的F#方式是使用异步工作流 。 不幸的是, 他们不支持等待非通用Task 。 但是使用上述问题中的一个解决方法,您的代码可能如下所示:

 override this.DoStuff() = async { do! this.Out.WriteLineAsync("hey from F#") |> Async.AwaitVoidTask return SomeEnum.Bar } |> Async.StartAsTask 

我相信FSharp包装任务的方式是使用

 var a = Async.AwaitIAsyncResult(somecsharpreturningtask) |> ignore