我必须使用F#实现C#接口。接口和我必须使用的许多方法都是用C#编写的,并且大量使用异步。

从C#移植到F#的示例代码:

public async Task CloseAsync(PartitionContext context, CloseReason reason)
{
    Console.WriteLine(string.Format("Processor Shuting Down.  Partition '{0}', Reason: '{1}'.", this.partitionContext.Lease.PartitionId, reason.ToString()));
    if (reason == CloseReason.Shutdown)
    {
        await context.CheckpointAsync();
    }
}


这可能是有问题的,因为F#和C#不使用相同的异步模式或类型。上面的功能是我需要实现的接口的一部分。我的问题在于如何使用F#等待context.CheckpointAsync(),使其仍然返回Task

这是我试图去的方向,但是没有用。 context.CheckpointAsync返回Task<a>而不是Task。此外,在其他情况下,如果没有任何操作,该怎么办?

interface IEventProcessor with
    member this.CloseAsync(context:PartitionContext, reason:CloseReason) =
        match reason with
        | CloseReason.Shutdown -> context.CheckpointAsync() |> Async.AwaitTask
        | _ -> ()

最佳答案

Task也是IAsyncResult,这意味着您可以使用Async.AwaitIAsyncResult并忽略输出。

将所有内容包装在异步计算表达式中,将其作为Task 启动,然后转换为Task。

interface IEventProcessor with

    member __.CloseAsync(context : PartitionContext, reason : CloseReason) =
        async {
            if reason = CloseReason.Shutdown then
                do! context.CheckpointAsync() |> Async.AwaitIAsyncResult |> Async.Ignore
        }
        |> Async.StartAsTask :> Task

10-07 20:00
查看更多