Async รออยู่ใน F #

ฉันกำลังเขียน C# บางส่วนในแล็บนี้ใหม่เป็น F#: https://github.com/Microsoft/TechnicalCommunityContent/tree/master/IoT/Azure%20Stream%20Analytics/Session%202%20-%20Hands%20On

ฉันกำลังอยู่ในแบบฝึกหัดที่ 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# world ได้อย่างไร?
  2. ฉันจะคืนกรณี NOT -> C# ได้อย่างไร เพียงเพิกเฉยต่อความเป็นไปได้นั้น

person Jamie Dixon    schedule 25.05.2017    source แหล่งที่มา


คำตอบ (1)


  1. หากค่ามีประเภท Async<'T> คุณสามารถส่งคืนได้โดยไม่ต้องใช้คำหลักใดๆ หากมีประเภท Task หรือ Task<'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 ()
    }

ในความเป็นจริง การใช้เวิร์กโฟลว์แบบอะซิงก์ทำให้คุณสามารถวาง () case ได้เหมือนกับ 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
    }
person Tarmil    schedule 25.05.2017
comment
IEventProcessor CloseAsync ส่งกลับงาน ดังนั้น | CloseReason.Shutdown -› context.CheckpointAsync() ใช้งานได้ จำเป็นต้องหาวิธีคืนงานว่าง - person Jamie Dixon; 25.05.2017
comment
สิ่งนี้ทำได้: จับคู่เหตุผลกับ | CloseReason.Shutdown -› บริบท CheckpointAsync() | _ -> งานงานเสร็จสมบูรณ์ - person Jamie Dixon; 25.05.2017
comment
อ๋อ ขออภัย ฉันอ่านคำถามของคุณผิด ฉันคิดว่าคุณกำลังแปลงจาก Task เป็น Async นอกเหนือจากการเปลี่ยนจาก C# เป็น F# - person Tarmil; 25.05.2017
comment
หากคุณใช้ F# async แทน Task ไม่ใช่แบบแผนในการตั้งชื่อวิธี AsyncClose แทน CloseAsync ใช่หรือไม่ - person Bent Tranberg; 26.05.2017