2017-12-13 6 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

관련 문제