私はF#の非同期ワークフローを理解しようとしていますが、実際には理解できない部分があり、誰かがそれを手伝ってくれることを願っています。なぜ非同期<T>を別の非同期ワークフローにラップして、それ?
次のコードは正常に動作します:
let asynWorkflow = async{
let! result = Stream.TryOpenAsync(partition) |> Async.AwaitTask
return result
}
let stream = Async.RunSynchronously asynWorkflow
|> fun openResult -> if openResult.Found then openResult.Stream else Stream(partition)
私はTryOpenAsyncタスクの種類を返す非同期ワークフローを定義します。 Async.AwaitTaskを使って非同期に変換します。 (Side quest: "Await" Task?それを変換するのを待ってはいませんか?Task.Waitやawaitキーワードとは関係ありません。私はそれを "待つ"ように!それを返す。 ワークフローを開始するには、ワークフローを開始し結果を返す(バインドする)RunSynchronouslyを使用します。結果で、ストリームが見つかったかどうかを確認します。
しかし、今私の最初の質問に。 TryOpenAsync呼び出しを別の非同期計算でラップして、なぜかする必要があります。 (「待って」)それ? など。次のコードは動作しません。
私はAwaitTaskで非同期にし、RunSynchronouslyで起動すると思っていました。その後、結果を使用します。何が欠けていますか?
私の2番目の質問は、なぜ "Async.Let!"機能はありますか?たぶんそれは動作しないか、またはそれ以上なぜ以下のコードではうまくいかないのでしょうか?
let ``let!`` task = async{
let! result = task |> Async.AwaitTask
return result
}
let stream = Async.RunSynchronously (``let!`` (Stream.TryOpenAsync(partition)) )
|> fun openResult -> if openResult.Found then openResult.Stream else Stream(partition)
TryOpenAsyncをパラメータとして挿入するだけで動作しません。言うことは、私がFSI全体がハングすることを意味しません。だから私の非同期/ "待っている"と関係があります。
---アップデート:FSIで動作するコードの
結果:FSIでコードを動作していないの
>
Real: 00:00:00.051, CPU: 00:00:00.031, GC gen0: 0, gen1: 0, gen2: 0
val asynWorkflow : Async<StreamOpenResult>
val stream : Stream
結果:
>
そして、あなたはFSIに何かを実行することはできませんもう一度
---更新2
私はStreamstoneを使用しています。ここではC#の例:https://github.com/yevhen/Streamstone/blob/master/Source/Example/Scenarios/S04_Write_to_stream.cs
、ここStream.TryOpenAsync:それは私には動作するはずのようhttps://github.com/yevhen/Streamstone/blob/master/Source/Streamstone/Stream.Api.cs#L192
あなたのコードはどのように機能しませんか?エラーは何ですか? 'async'ワークフローを作成する必要はありません。 – Lee
私の最後の文で述べたように、私はFSIで起動し、実行して実行します( "ハングする")。 FSIへの返答はありません。私はちょうどFSIを再起動することができます – KCT