异步等待在F#
问题描述:
我重写了一些C#在这个实验室中F#:https://github.com/Microsoft/TechnicalCommunityContent/tree/master/IoT/Azure%20Stream%20Analytics/Session%202%20-%20Hands%20On异步等待在F#
我在练习6,#17 - 创建SimpleEventProcessor
类型。
我要实现的CloseAsync
方法
C#
async Task IEventProcessor.CloseAsync(PartitionContext context, CloseReason reason)
{
Debug.WriteLine("Processor Shutting Down. Partition '{0}', Reason: '{1}'.", context.Lease.PartitionId, reason);
if (reason == CloseReason.Shutdown)
{
await context.CheckpointAsync();
}
}
,我开始是这样的:
member this.CloseAsync(context, reason) =
Debug.WriteLine("Processor Shutting Down. Partition '{0}', Reason: '{1}'.", context.Lease.PartitionId, reason)
match reason with
| CloseReason.Shutdown -> await context.CheckpointAsync()
| _ ->()
,但我有2个问题:
- 我怎么回在F#世界等待?
- 如何返回NOT情况 - > C#只是忽略这种可能性。
答
如果值的类型
Async<'T>
,你可以只返回它没有任何关键字。如果它有Task
或Task<'T>
,则可以执行|> Async.AwaitTask
。您可以返回
async { return() }
。
所以,你得到这样的:
member this.CloseAsync(context, reason) =
Debug.WriteLine("Processor Shutting Down. Partition '{0}', Reason: '{1}'.", context.Lease.PartitionId, reason)
match reason with
| CloseReason.Shutdown -> context.CheckpointAsync() |> Async.AwaitTask
| _ -> async { return() }
另一种可能是把整个块在async
工作流程,并使用return!
1和return
2:
member this.CloseAsync(context, reason) =
async {
Debug.WriteLine("Processor Shutting Down. Partition '{0}', Reason: '{1}'.", context.Lease.PartitionId, reason)
match reason with
| CloseReason.Shutdown -> return! context.CheckpointAsync() |> Async.AwaitTask
| _ -> return()
}
在事实上,使用异步工作流程允许您类似于C#删除()
的情况:
member this.CloseAsync(context, reason) =
async {
Debug.WriteLine("Processor Shutting Down. Partition '{0}', Reason: '{1}'.", context.Lease.PartitionId, reason)
if reason = CloseReason.Shutdown then
return! context.CheckpointAsync() |> Async.AwaitTask
}
IEventProcessor CloseAsync返回一个Task。所以| CloseReason.Shutdown - > context.CheckpointAsync()的作品。需要弄清楚如何返回一个空的任务 –
这样做:匹配原因 | CloseReason.Shutdown - > context.CheckpointAsync() | _ - > Task.CompletedTask –
对不起,我误解了你的问题,不知怎的,我以为你是从Task转换到Async,除了从C#转到F#。 – Tarmil