我需要使用F#实现一个C#接口。这个接口和我需要使用的许多方法都是用C#编写的,并且非常频繁地使用了异步(async)。
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#不使用相同的异步模式或类型。上面的函数是我需要实现的接口的一部分。我的问题在于如何以这样的方式等待
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
| _ -> ()
member this.CloseAsync(context:PartitionContext, reason:CloseReason) = match reason with | CloseReason.Shutdown -> context.CheckpointAsync() | _ -> let a = new System.Action(fun t -> ()) new Task(a)
- David Crook