2011-11-05 3 views
32

मैं एफ # में सी # लाइब्रेरी का उपभोग करने की कोशिश कर रहा हूं। लाइब्रेरी एसिंक/प्रतीक्षा का भारी उपयोग करता है। मैं एफ # में async { ... } वर्कफ़्लो के भीतर उपयोग करना चाहता हूं।सादा कार्य पर Async.AwaitTask कैसे करें (कार्य <T> नहीं)?

मुझे लगता है कि हम Async.AwaitTask पर एसिंक सी # विधियों पर Task<T> लौट सकते हैं, लेकिन उन लोगों के बारे में क्या सादा Task लौट रहे हैं?

शायद, वहाँ एक सहायक Async<unit> करने के लिए इन कन्वर्ट करने के लिए या परिवर्तित करने के लिए TaskTask<unit> को तो यह Async.AwaitTask के साथ काम करेंगे है? अनंत समय समाप्ति के साथ

let awaitTask (t: Task) = t.ContinueWith (fun t ->()) |> Async.AwaitTask 

या AwaitIAsyncResult:

उत्तर

43

आप ContinueWith उपयोग कर सकते हैं

let awaitTask (t: Task) = t |> Async.AwaitIAsyncResult |> Async.Ignore 
+10

आह, मैं देख रहा हूँ। बेशक, कार्य सभी के बाद एक IAsyncResult है। 'प्रतीक्षा करने के लिए छोटा' टास्क = Async.AwaitIAsyncResult >> Async.Ignore 'बहुत धन्यवाद! – AshleyF

10

मैं वास्तव में समारोह रचना का उपयोग कर एशले के सुझाव पसंद आया।

module Async = 
    let AwaitTaskVoid : (Task -> Async<unit>) = 
     Async.AwaitIAsyncResult >> Async.Ignore 

तो यह Async.AwaitTask के साथ Intellisense में प्रकट होता है: साथ ही, आप इस तरह Async मॉड्यूल विस्तार कर सकते हैं। इसका उपयोग इस तरह किया जा सकता है:

do! Task.Delay delay |> Async.AwaitTaskVoid 

बेहतर नाम के लिए कोई सुझाव?

12

अद्यतन:

एफ # 4.0 के लिए FSharp.Core पुस्तकालय अब एक Async.AwaitTask अधिभार कि एक सादे Task स्वीकार करता है भी शामिल है। यदि आप एफ # 4.0 का उपयोग कर रहे हैं तो आपको नीचे दिए गए कोड के बजाय इस कोर फ़ंक्शन का उपयोग करना चाहिए।


मूल जवाब:

अपने कार्य को एक अपवाद फेंक सकता है तो आप शायद भी इस के लिए जाँच करना चाहते हैं। जैसे

let awaitTask (task : Task) = 
    async { 
     do! task |> Async.AwaitIAsyncResult |> Async.Ignore 
     if task.IsFaulted then raise task.Exception 
     return() 
    } 
+0

'कार्य बढ़ाएं। अपवाद' केवल समेकित अपवाद उठाएगा; अपने 'इनर एक्सेप्शन' संग्रह तक पहुंचने के लिए शायद बेहतर है, और पहले को बढ़ाएं (जब तक संग्रह खाली नहीं है) –

1

ठीक से ठीक से दोनों अपवाद और रद्द करने का प्रचार करने के लिए, मुझे लगता है कि आप कुछ इस तरह (आंशिक रूप से टॉमस Petříček द्वारा नष्ट कर दिया जवाब के आधार पर) की जरूरत है:

module Async = 
    let AwaitVoidTask (task : Task) : Async<unit> = 
     Async.FromContinuations(fun (cont, econt, ccont) -> 
      task.ContinueWith(fun task -> 
       if task.IsFaulted then econt task.Exception 
       elif task.IsCanceled then ccont (OperationCanceledException()) 
       else cont()) |> ignore) 

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^