2017-12-13 4 views
0

Die folgende Instanz Methode dauert sehr lange.Wie führe ich eine Methode asynchron aus?

Daher möchte ich diesen Aufruf asynchron beim Initialisieren einer Server-Sitzung machen.

Als Ergebnis dachte ich, ich folgendes nehmen könnte:

CachedTags.Instance() |> ignore 

Und es wie folgt schreiben:

Tasks.Task.Run(fun _ -> CachedTags.Instance() |> ignore) |> ignore 

Ich bin ratlos, wenn ich das richtig mache.
Was ist die empfohlene Technik, um dies zu erreichen?

Antwort

2

Nach this tutorial, können Sie dies versuchen:

module CachedTags = 

    // analog of task in C# 
    let private x = async { 
     [1..25] |> List.collect getTags 
    } |> Async.StartAsTask 

Und wenn Sie das Ergebnis benötigen, können Sie different options verwenden:

// synchronously wait in current thread 
x.Wait() 
// use system class in current thread 
x |> Async.RunSynchronously 
// await result 
let! result = Async.AwaitTask(x) 
0

Scott, wollen einfach nur eine Alternative bieten. Wenn Sie Ihre Tag-Liste beim ersten Zugriff instanziieren (anstatt bei der Modulinitialisierung, die Sie scheinbar vermeiden), könnten Sie eine Lazy-Berechnung versuchen.

module CachedTags = 

    let private x = lazy ([1..25] |> List.collect getTags) 
    let Instance() = x.Value 

let tags = CachedTags.Instance() 

Die Verwendung von lazy ist ziemlich idiomatische und instanziert Ihren Ausdruck nur auf dem ersten Aufruf von Instance() (das heißt, die erste Beurteilung der x.Value).

https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/lazy-computations

Verwandte Themen