异步等待在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个问题:

  1. 我怎么回在F#世界等待?
  2. 如何返回NOT情况 - > C#只是忽略这种可能性。

  1. 如果值的类型Async<'T>,你可以只返回它没有任何关键字。如果它有TaskTask<'T>,则可以执行|> Async.AwaitTask

  2. 您可以返回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 
    } 
+0

IEventProcessor CloseAsync返回一个Task。所以| CloseReason.Shutdown - > context.CheckpointAsync()的作品。需要弄清楚如何返回一个空的任务 –

+0

这样做:匹配原因 | CloseReason.Shutdown - > context.CheckpointAsync() | _ - > Task.CompletedTask –

+0

对不起,我误解了你的问题,不知怎的,我以为你是从Task转换到Async,除了从C#转到F#。 – Tarmil