2017-12-13 15 views
0

次のインスタンスメソッドは実行にかなりの時間がかかります。メソッドを非同期に実行するにはどうすればよいですか?

module CachedTags = 

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

このように、私はサーバーセッションを初期化するときにこの呼び出しを非同期にしたいと考えています。

結果として、私は次のことを取ることができると思った:

CachedTags.Instance() |> ignore 

そして、このようにそれを書く:

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

私はこれを正しくやっている場合、私は無知です。
これを行うには、どのような方法が推奨されますか?

module CachedTags = 

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

をそして、あなたは結果を必要とするとき、あなたはdifferent optionsを使用することができます:

答えて

2

this tutorialによると、あなたはこれを試すことができます

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

スコットは、単に選択肢を提供したいと考えています。最初のアクセスでタグリストをインスタンス化する(モジュールの初期化ではなく、回避すると思われる)場合は、遅延計算を試してみてください。

module CachedTags = 

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

let tags = CachedTags.Instance() 

lazyの使用はかなり慣用的である、と(つまり、x.Valueの最初の評価である)のみInstance()の最初の呼び出し時に、あなたの表現をインスタンス化します。

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

関連する問題