2017-05-25 130 views
3

我重寫了一些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#只是忽略這種可能性。

回答

6
  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