2017-04-18 12 views
2

으로 변환합니다. 컴파일 오류가 발생합니다.오류 F # - C# 비동기 호출 : 내 F # 코드에서 C# 라이브러리에있는 비동기 메서드를 호출하려고하면 Threading.Tasks.Tak <MyType>을 비동기 <'a>

이 표현은

SendMessageAsync는 C#을 라이브러리에 리턴 Threading.Thread.Tasks.Task

let sendEmailAsync message = 
    async { 
     let! response = client.SendMessageAsync(message) 
     return response 
    } 
를 Threading.Thread.Tasks.Task 입력 한 여기 유형 비동기 <을 '이 미칠 것으로 예상> 되었으나

답변

2

Task<'T>Async<'T> 사이의 변환에는 Async.AwaitTask 기능이 내장되어 있습니다.

type Async with 
    member this.AwaitPlainTask (task : Task) = 
     task.ContinueWith(fun t ->()) 
     |> Async.AwaitTask 

그런 다음 당신은 다음과 같이 호출 할 수 있습니다 :

당신이 도우미 함수 만들 수 있습니다 Async<unit> 일반 Task 사이의 변환하고,이 경우에는 물론

let sendEmailAsync message = 
    async { 
     let! response = Async.AwaitPlainTask <|client.SendMessageAsync(message) 
     return response 
    } 

를, 응답 () 이외의 다른 문자 일 수는 없습니다. 따라서

let sendEmailAsync message = Async.AwaitPlainTask <|client.SendMessageAsync(message) 
+0

많은 감사합니다! Async.AwaitPlainTask 대신 Async.AwaitTask를 찾을 수 없습니다. –

+0

아, 내 실수. 방금 작성한 유형을 찾았습니다. –

+0

@NishantNidhiKumar 네, 핵심 라이브러리에 내장되어 있지 않지만 생성하는 것이 유용한 경우가 많습니다. – TheInnerLight