我必须使用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