2017-12-12 12 views
1

簡単な操作方法はF#でを待っていますか? C#のでC#に似たAsyncメソッドを待つ方法

私はこのようなコードを持っている:

await collection.InsertOneAsync(DO); 
var r = collection.ReplaceOneAsync((fun d -> d.Id = DO.Id), DO) 

は、だから、私はC#のコードとの類似になる私のF#コードに LET待つ= ...を作成しました。

私の現在のF#コードはこれです:

let awaits (t: Threading.Tasks.Task) = t |> Async.AwaitTask |> Async.RunSynchronously 
let await (t: Threading.Tasks.Task<'T>) = t |> Async.AwaitTask |> Async.RunSynchronously 


let Busca (numero) = 
    let c = collection.Find(fun d -> d.Numero=numero).ToList() 
    c 

let Insere(DO: DiarioOficial) = 
    //collection.InsertOneAsync(DO) |> Async.AwaitTask |> Async.RunSynchronously 
    collection.InsertOneAsync(DO) |> awaits 

let Salva (DO: DiarioOficial) = 
    //let r = collection.ReplaceOneAsync((fun d -> d.Id = DO.Id), DO) |> Async.AwaitTask |> Async.RunSynchronously 
    let r = collection.ReplaceOneAsync((fun d -> d.Id = DO.Id), DO) |> await 
    r 

私は(待ち受け)のawaitのための唯一の定義を持っているしたいのですが、Insereに、型が上のタスクですが、ので、私は何ができる最善のは、これです

FS0001 The type 'Threading.Tasks.Task' is not compatible with the type 'Threading.Tasks.Task<'a>'

場合:サルバ、I型のみを使用を待っていた場合、私はこのコンパイルエラーを取得するタスク<「T>

です私はこれをどのように行うことができます

let await = ... 

単一
を待って、それはコンパイルが、私はタスク
非同期(async)から戻り値の型を失い、私はのawaitをマージしたいと待っだけでしょうか?

+0

参照してくださいます。https:/ /stackoverflow.com/questions/8022909/how-to-async-awaittask-on-plain-task-not-taskt – abatishchev

+0

私がしようとしているように、それらの誰もが単純なlet awaitステートメントを持っていません。 – Tony

答えて

3

F#では、別の構文を使用する傾向があります。例えば、ここに:https://fsharpforfunandprofit.com/posts/concurrency-async-and-parallel/.

かここに:https://docs.microsoft.com/en-us/dotnet/fsharp/tutorials/asynchronous-and-concurrent-programming/async

C#のタスクでの作業のアイデアは、あなたはおそらく別の方法でそれを行うことができますAsync.Await<'T>

で非同期にそれらを「変換」することですが、それは最も簡単です。

1

F#とC#の両方に書き込み非同期コードの2つの部分があります。

  • あなたは、非同期の方法や、コードブロックをマークする必要があります。 C#では、これはasyncキーワードを使用して行われます。 F#の等価物は、async { ... }ブロック(式ですが、それ以外の場合は似ています)を使用することです。

  • asyncの中またはasync { .. }ブロックの中で、ブロックしない呼び出しを行うことができます。 C#では、これはawaitを使用して行われ、F#ではlet!を使用して行われます。これは単なる関数呼び出しではなく、コンパイラがこれを特別な方法で処理することに注意してください。

F#はまた、むしろTask<T>よりAsync<T>タイプを使用するが、それらは変換が容易である - 例えばAsync.AwaitTaskを使用してください。だから、あなたは、おそらくこのような何かしたい:

let myAsyncFunction() = async { 
    let! _ = collection.InsertOneAsync(DO) |> Async.AwaitTask 
    let r = collection.ReplaceOneAsync((fun d -> d.Id = DO.Id), DO) 
    // More code goes here 
} 

私はアイデアを表示するためにlet!を使用していますが、unitを返す非同期操作を持っている場合、あなたも使用することができますdo!

do! collection.InsertOneAsync(DO) |> Async.AwaitTask 
関連する問題