問題タブ [async-workflow]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
f# - F# Async.RunSynchronously タイムアウトと cancelToken を使用
タイムアウトと CancellationToken を指定して Async.RunSynchronously を呼び出すと、タイムアウト値が無視されるようです。CancellationToken で CancelAfter を呼び出すことでこれを回避できますが、理想的には、ワークフローで発生する例外、TimeOutExceptions と OperationCanceledExceptions を区別できるようにしたいと考えています。
以下のサンプルコードがこれを示していると思います。
次の出力は、タイムアウトが最初のケース (CancelationToken が指定されていない場合) でのみ有効であることを示しています。
これは意図した動作ですか?私が求めている動作を取得する方法はありますか?
ありがとう!
unit-testing - F# 非同期ワークフローをテストするときに便利なスタック トレースを取得する方法
次の非同期ワークフローをテストしたいと思います (NUnit+FsUnit を使用):
私はそれのために次のテストを書きました:
foo がスローされるため、単体テスト ランナーで次のスタック トレースを取得します。
残念ながら、スタックトレースは例外が発生した場所を教えてくれません。RunSynchronously で停止します。
どこかで Async.Catch が魔法のようにスタック トレースを復元すると聞いたので、テストを調整しました。
これは醜いですが、少なくとも有用なスタックトレースを生成します:
今回は、スタック トレースにエラーが発生した正確な場所が表示されます: ExplorationTests.foo@line 71
Async.Catch と 2 つの選択肢の一致を取り除きながら、有用なスタック トレースを取得する方法はありますか? 非同期ワークフロー テストを構築するためのより良い方法はありますか?
asynchronous - BlockingQueueAgent を使用した asyncSeq の並列消費
.NET で同時実行がどのように機能するかを理解していないことで、再び恥ずかしい思いをする時が来ました :P
asyncSeq 入力を受け取り、それを n 個の並列コンシューマーに配布する非同期ワークフローの作成をカプセル化できる関数を作成しようとしています。
そして、このようなコードでテストして、作成が速いシーケンスをシミュレートしましたが、各アイテムの作業には時間がかかります.
EDIT:私は最初の問題を修正したようです(ええと、EventWaitHandleで何をしていたのか本当に考えていませんでした. F#で。
asynchronous - Async と Option モナドを組み合わせる
最近、多くのネストされた非同期ワークフローで動作するコードを書いているときに、匂いがするパターンが出現しているのを見つけました。簡単な例:
「verboseFun」は冗長に思えますが、Option モナドと Async モナドを組み合わせて、パターン マッチなしで書き直す方法が思い浮かびません。みたいなことを考えていた
これを実現するために利用できる構成要素を知らない可能性が非常に高いように思えました。
編集:トーマスの回答後の追加の説明。
すべてが同期している場合、私にとって些細なことを適応させようとしていました。
ネストされた非同期ワークフローの一部になります。もともと「そこにドッコッ!」と思っていたので思いつきました。
しかし、VSが無視を要求し始めたので、すぐに私には悪臭がしました。これが明確になることを願っています。
c# - F# の ConfigureAwait(false)
C# で記述され、async/await パターンを使用するライブラリを使用しています。C# では何かを呼び出すことで待機できますConfigureAwait(false)
が、F# からライブラリを使用すると、同じことを行う方法がわかりません。
現在、F# ワークフローSomeMethodAsync() |> Async.AwaitTask
に変換するために行っていますが、呼び出すときに F#Async
と同じようにするにはどうすればよいですか?ConfigureAwait(false)
SomeMethodAsync
編集:
F# の Slack チャネルでいくつかの素晴らしいヘルプといくつかの追加のグーグルを使用して、ここでコンテキストを切り替える方法の適切な説明を見つけました: http://toasp.net/blog/async-non-blocking-gui.aspx/
asynchronous - Async をラップする必要があるのはなぜですか別の非同期ワークフローに入れてみましょう! それ?
F# の非同期ワークフローを理解しようとしていますが、本当に理解できない部分が 1 つあります。
次のコードは正常に動作します。
TryOpenAsync が型を返す非同期ワークフローを定義しますTask<StreamOpenResult>
。Async<StreamOpenResult>
Async.AwaitTaskで変換します。(サイドクエスト: "Await"Task? await じゃなくて変換するだけですよね? Task.Wait とか await キーワードとか関係ないと思います)。で「待って」let!
返します。ワークフローを開始するには、ワークフローを開始して結果を返す (バインドする) RunSynchronously を使用します。結果で、ストリームが見つかったかどうかを確認します。
しかし、今私の最初の質問に。TryOpenAsync 呼び出しを別の非同期計算でラップして、そのままにする必要があるのはなぜですか。(「待って」)それ?たとえば、次のコードは機能しません。
AwaitTask はそれを開始する必要があると思いましAsync<T>
たRunSynchronously
。次に、結果を使用します。何が恋しいですか?
私の 2 番目の質問は、なぜ「Async.Let!」があるのかということです。利用可能な機能? うまくいかないか、うまくいかないためか、次のコードでうまくいかないのはなぜですか?
TryOpenAsync をパラメーターとして挿入するだけですが、機能しません。うまくいかないと言うことは、FSI全体がハングアップすることを意味します。したがって、それは私の非同期/「待機」と関係があります。
- - アップデート:
FSI での作業コードの結果:
FSI でコードが機能しない結果:
そして、FSI では何も実行できなくなりました
--- 更新 2
ストリームストーンを使用しています。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