2013-09-03 2 views
5

Nehmen wir an, ich hatte eine F # -Berechnung in C# und ich wollte sie synchron laufen lassen. Was wäre der Unterschied unter der Haube zwischen:Async.RunSynchronously() vs Async.StartAsTask() Ergebnis

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

oder

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

Sorry, wenn dies wie eine einfache Frage scheint, ich bin ganz neu zu Asynchron-Programmierung!

Antwort

8

ich glaube, sie im wesentlichen die gleiche sein wird - wie Reed sagt, die erste, die Arbeit direkt Warteschlangen während der andere ein Task schafft, aber die erstellt Task ist ziemlich kompaktes Objekt (unter der Abdeckung, das ist fast die gleiche und die Aufgabe wird erstellt mit TaskCompletionSource - Sie können see the code here).

Wenn Sie die F # -Bibliothek unter Kontrolle haben, würde ich empfehlen, nur eine Methode verfügbar zu machen, die Task zurückgibt und die F # -Assync ausblendet - dies macht die Verwendung von C# viel bequemer und Sie vermeiden all das Besondere F # Typen (wie Optionen). Wenn Sie someWork Funktion in F #, dann würde ich schreiben:

type NiceCSharp = 
    static member SomeWork() = 
    Async.StartAsTask(someWork()) 
    static member SomeWork(cancellationToken) = 
    Async.StartAsTask(someWork(), cancellationToken = cancellationToken) 

Auf der C# Seite finden Sie eine schöne überladene Methode sehen, die Task und arbeitet gut mit await zurückgibt. Natürlich können Sie das Ergebnis nur synchron mit Result abwarten, aber der Overhead ist nicht zu groß - und die Tatsache, dass Sie eine schöne C# API offen legen, wird es einfacher machen, F # in Ihr System zu integrieren.

Verwandte Themen