2013-09-03 16 views
5

C# ile başa çıkmak için bir F # hesaplama yaptığımı ve eşzamanlı çalışmasını sağlamak istediğimi söyleyelim.Async.RunSynchronously() vs Async.StartAsTask() Sonuç

public static T RunSync<T>(FSharpAsync<T> computation) 
    { 
     return FSharpAsync.RunSynchronously(computation, 
      timeout: FSharpOption<int>.None, 
      cancellationToken: FSharpOption<System.Threading.CancellationToken>.None 
      ); 
    } 

veya

public static T RunSync<T>(FSharpAsync<T> computation) 
    { 
     return FSharpAsync.StartAsTask(computation, 
      taskCreationOptions: FSharpOption<TaskCreationOptions>.None, 
      cancellationToken: FSharpOption<System.Threading.CancellationToken>.None 
      ).Result; 
    } 

bu basit bir soru gibi görünüyor eğer Üzgünüm, zaman uyumsuz programlama oldukça yeni duyuyorum: Ne arasındaki kaputun altında fark olurdu!

cevap

8

onlar temelde aynı olacağını düşünüyorum - Reed söylediği gibi diğeri Task yaratır ama yaratılan Task örtüsü altında (oldukça hafif nesne iken, ilki bu hemen hemen aynıdır, doğrudan işi kuyruklar ve görev TaskCompletionSource kullanılarak oluşturulur - see the code here yapabilirsiniz).

F # kitaplığı denetimindeyseniz, benim önerim yalnızca Task döndüren ve F # async öğesini gizleyen bir yöntemi göstermek olacaktır - bu, C# kullanımını daha kullanışlı hale getirecektir ve tüm özel durumlardan sakınacaksınız F # türleri (seçenekler gibi). Eğer F # someWork işlevi varsa, o zaman ben yazardım:

C# tarafında
type NiceCSharp = 
    static member SomeWork() = 
    Async.StartAsTask(someWork()) 
    static member SomeWork(cancellationToken) = 
    Async.StartAsTask(someWork(), cancellationToken = cancellationToken) 

, sen Task döner ve await iyi çalışır güzel Aşırı yüklü bir yöntem göreceksiniz. Tabii ki, sonucu Result kullanarak eşzamanlı olarak bekleyebilirsiniz, ancak ek yükü çok büyük değildir - ve güzel C# API'yi açığa çıkarmanız, F # sisteminize entegre edilmesini kolaylaştırır.