2017-04-18 9 views
2

に変換します。 以下のコンパイルエラーが発生します。エラーF# - c#async calls:私のF#コードからC#ライブラリにある非同期メソッドを呼び出そうとすると、Threading.Tasks.Tak <MyType>をAsync <'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関数があります。平野Task間の変換に

Async<unit>あなたはヘルパー関数を作成することができます。

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

その後、あなたはこのようにそれを呼び出すことができます。もちろん

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

関連する問題